Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Total playback time is abnormally long when running in Safari / Safariで処理すると総再生時間が変 #1

Closed
tamaina opened this issue Sep 18, 2023 · 39 comments

Comments

@tamaina
Copy link
Owner

tamaina commented Sep 18, 2023

However Chrome-processed videos don't increase total playback time.

image

image

@tamaina
Copy link
Owner Author

tamaina commented Sep 18, 2023

test-13.mp4

Safariで作ったmp4

@tamaina
Copy link
Owner Author

tamaina commented Sep 18, 2023

ffmpegはmfra/tfra boxをつけているので、mfra/tfra boxを追加すればうまいこといきそうではあるがmp4boxを改造する必要がある

image

@tamaina
Copy link
Owner Author

tamaina commented Sep 18, 2023

とりあえずIssueを出してみた gpac/mp4box.js#355

@tamaina
Copy link
Owner Author

tamaina commented Sep 18, 2023

でもworkerではない処理系の時は普通に時間合ってたんだよな

@tamaina
Copy link
Owner Author

tamaina commented Sep 18, 2023

でもworkerではない処理系の時は普通に時間合ってたんだよな

でもなんか異常なので今の実装の方が正しいのかも

@tamaina
Copy link
Owner Author

tamaina commented Sep 18, 2023

(ところで: Chromeで処理した動画が2倍で済んでてSafariで処理した動画はめっちゃ長い理由を理解していない)

@tamaina
Copy link
Owner Author

tamaina commented Sep 18, 2023

@tamaina
Copy link
Owner Author

tamaina commented Sep 19, 2023

mfra/tfra/mfroを書いてみたけど解決しなかった

@tamaina
Copy link
Owner Author

tamaina commented Sep 19, 2023

image

ffmpeg/ffprobeも同じような時間を出してくる

@tamaina
Copy link
Owner Author

tamaina commented Sep 19, 2023

ffmpegのソースを読めば原因が分かりそうだけどパッと検索した限り端緒を見つけられなかった

@tamaina
Copy link
Owner Author

tamaina commented Sep 19, 2023

@tamaina
Copy link
Owner Author

tamaina commented Sep 19, 2023

@tamaina
Copy link
Owner Author

tamaina commented Sep 19, 2023

@tamaina
Copy link
Owner Author

tamaina commented Sep 19, 2023

@tamaina
Copy link
Owner Author

tamaina commented Sep 19, 2023

While processing ffprobe, open_input_file() calls avformat_find_stream_info() to correct information then calls av_dump_format() to output.

avformat_find_stream_info() calls estimate_timings().

estimate_timings() is most relevant for calculating duration, conditionally branching and calling lower level functions.

@tamaina
Copy link
Owner Author

tamaina commented Sep 19, 2023

r_frame_rateがおかしくて、これによって色々ダメなことが起きてるらしい

@tamaina
Copy link
Owner Author

tamaina commented Sep 19, 2023

ログによれば max_analyze_duration に引っかかってるっぽい

https://github.com/FFmpeg/FFmpeg/blob/fa20f5cd9e131f22da06ef57bf5aedd87ff51a90/libavformat/demux.c#L2730

@tamaina
Copy link
Owner Author

tamaina commented Sep 19, 2023

いや結局それってtime_baseがおかしいので(?)ffmpegの内部durationが滅茶苦茶になっているだけだよな

@tamaina
Copy link
Owner Author

tamaina commented Sep 19, 2023

VideoEncoderで指定してやらないとdescriptionのSPSのフレームレートが変になって、そいでもってtime_baseがおかしくなるのか

@tamaina
Copy link
Owner Author

tamaina commented Sep 19, 2023

残念ながらVideoEncoderにframerateを設定しても変わらん

@tamaina
Copy link
Owner Author

tamaina commented Sep 19, 2023

avcDecoderConfigRecord Safari vs Chrome

image

@tamaina
Copy link
Owner Author

tamaina commented Sep 19, 2023

(最後のPPSが変わってないからいいじゃんと勘違いしていたけど、関係あるのは真ん中のSPSだったわ)

@tamaina
Copy link
Owner Author

tamaina commented Sep 19, 2023

@tamaina
Copy link
Owner Author

tamaina commented Sep 19, 2023

timing_info_present_flagがあったらここでframerateとして記録している?

av_reduceは引数2, 3を約分し(reduce)て引数0, 1(ポインタ渡し)に代入するという感じらしい

@tamaina
Copy link
Owner Author

tamaina commented Sep 19, 2023

@tamaina
Copy link
Owner Author

tamaina commented Sep 19, 2023

https://github.com/FFmpeg/FFmpeg/blob/fa20f5cd9e131f22da06ef57bf5aedd87ff51a90/libavcodec/h264_ps.c#L560

これの起動の仕方に15分悩んでたけどコマンドに-debug pictを付け足せばいけた

@tamaina
Copy link
Owner Author

tamaina commented Sep 19, 2023

memo

ffprobe target.mp4  -hide_banner -loglevel warning -loglevel info -loglevel verbose -loglevel debug -debug pict -of default -show_streams

image

@tamaina
Copy link
Owner Author

tamaina commented Sep 19, 2023

r_frame_rateは主にff_rfps_calculateが決定してそうだけど解読が億劫

@tamaina
Copy link
Owner Author

tamaina commented Sep 20, 2023

睡眠を経て開いたら何をやってたかわからなくなったが結局SPSをいじってnum_units_in_tick/time_scaleを突っ込むのが手っ取り早い気がしていたのは覚えている

@tamaina
Copy link
Owner Author

tamaina commented Sep 20, 2023

ChatGPTに聞いてみた

そんなコマンドあるんだ

image

@tamaina
Copy link
Owner Author

tamaina commented Sep 20, 2023

SPSをいじらなくてもVideoEncoderのconfig.decoderConfig.descriptionがtiming_info_present_flag=1にしてくれれば済む件

@tamaina
Copy link
Owner Author

tamaina commented Sep 20, 2023

つかedts/elstのmedia_timeを参考にしてくれれば悩むことないんだけどそういうふうに仕向けられないかしら

@Mr-Ojii
Copy link

Mr-Ojii commented Sep 21, 2023

少し調べてみたところ、こちらはtransform.tsで最終フレーム付近のフレームのソートが正常にできていないことが根本的な問題のようです

@tamaina
Copy link
Owner Author

tamaina commented Sep 22, 2023

エンコードした後のtimestampが順番通りでなく出てきてるんだわこれ

@tamaina
Copy link
Owner Author

tamaina commented Sep 22, 2023

EncodedVideoChunkはソートしてはいけないのでうーん

@tamaina
Copy link
Owner Author

tamaina commented Sep 22, 2023

durationをsortの時点で付与するかしら

@tamaina
Copy link
Owner Author

tamaina commented Sep 22, 2023

transform.tsで最終フレーム付近のフレームのソートが正常にできていない

ばちくそ根本的な処理がまちがってました…

@tamaina tamaina closed this as completed Sep 22, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants