tamaina/venc2

処理が途中で止まる場合がある

Closed this issue · 7 comments

ソート受信のterminateまでは大丈夫なのは確認したが寝る

エンコードに一部が届いていない

sortでenqueueができなくなってるやつだ.
(対策が不十分だった

venc2/src/transform.ts

Lines 31 to 56 in ec1bec9

function enqueue(f: VideoFrameAndIsKeyFrame, controller: TransformStreamDefaultController<VideoFrameAndIsKeyFrame>) {
const prefferedDuration = f.frame.timestamp - prevTimestamp;
prevTimestamp = f.frame.timestamp;
if (f.frame.duration !== prefferedDuration) {
const frame = new VideoFrame(f.frame, {
timestamp: f.frame.timestamp,
duration: prefferedDuration,
visibleRect: f.frame.visibleRect ?? undefined,
});
if (DEV) console.log('sort: enqueue: duration is wrong', f.frame.timestamp, frame.duration, f.frame.duration, frame);
controller.enqueue({
frame,
isKeyFrame: f.isKeyFrame,
});
f.frame.close();
} else {
// durationが正しい場合はそのままenqueueする
// Chromeではどういうわけかnew VideoFrameで処理がストップする
// (特に最終フレームが来てキャッシュの放出をしている間)
// 原因はよくわからないがnew VideoFrameを極力使わないようにすることで処理のストップを回避できる
if (DEV) console.log('sort: enqueue:', f.frame.timestamp, f.frame.duration, f.frame);
controller.enqueue(f);
}
enqueuecnt++;
}

ここ

対策が不十分と言いつつそのほかの対策のアイデアが思いつかない

というかこの部分に関連してなのかSafariで時間が異常になる問題が再発した(同一箇所かも?)

Safariだと

await new Promise((resolve) => setTimeout(resolve, 0));

を追加すると動くようになるんだけど、durationがおかしくなる

やはりただのポカミスだった

transform中のエラーが全くハンドリングされないのでtry-catchを全てのtransformにつけることにした