web-dev-qa-db-ja.com

有用なフレームを落とさずにビデオフレームレートを下げる

もともと低フレームレート、おそらく15 fps、おそらく10 fps、あるいはそれ以下で記録されたセキュリティカメラからのビデオがあります。その後、他の誰かによって25 fpsに変換されました(期間は変更されません)。余分な重複フレームが追加されたと思いますが、これによって元のフレームが表示される正確な時刻がわずかに歪んでいる可能性もあります。

便利な実際のモーションのフレームをドロップせずに、ffmpegを使用してビデオを元のフレームレートに再エンコードしたいと思います。 fpsフィルタを使用するだけでは、保持するフレームを選択できません。丸め誤差のために、重複するフレームの一部が保持され、有用なフレームが永久に失われる可能性があると思います。さらに悪い。いずれにせよ、元のフレームレートが正確にわからないため、フィルターに指示する番号がわかりません。

Ffmpegでこのビデオを修復するにはどうすればよいですか?

ffmpeg -i "orig.mp4" -an -vcodec h264 -vf "fps=???" "fixed.mp4"
5
Boann

私はなんとか自分のファイルを修正することができました。 mpdecimate フィルターを見つけました。これは、ビデオストリームから重複またはほぼ重複するフレームをドロップします。最初に試した:

ffmpeg -loglevel debug -i orig.mp4 -an -vf "mpdecimate" test.mp4

トランスコーディング中に詳細情報を取得するために、-loglevel debugを追加しました。情報は、mpdecimateがフレームで何をしていたかを示していました。これは、このパターンの多くでした。

lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:44032 pts_time:3.44 drop_count:1
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:44544 pts_time:3.48 drop_count:2
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:45056 pts_time:3.52 drop_count:3
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:45568 pts_time:3.56 drop_count:4
781>=hi keep pts:46080 pts_time:3.6 drop_count:-1
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:46592 pts_time:3.64 drop_count:1
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:47104 pts_time:3.68 drop_count:2
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:47616 pts_time:3.72 drop_count:3
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:48128 pts_time:3.76 drop_count:4
821>=hi keep pts:48640 pts_time:3.8 drop_count:-1
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:49152 pts_time:3.84 drop_count:1
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:49664 pts_time:3.88 drop_count:2
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:50176 pts_time:3.92 drop_count:3
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:50688 pts_time:3.96 drop_count:4
793>=hi keep pts:51200 pts_time:4 drop_count:-1

つまり、一貫して4フレームを複製として連続してドロップし、5日ごとに保持していました。これは、元のフレームレートが現在の1/5であることを示しています。 ラッキーでした!ビデオの現在の25 fpsは元のフレームレートの倍数だったので、キープの時間的なずれに問題はないはずです。とドロップフレーム。そのため、-vf "fps=5"よりも複雑なものを使用せずに元のビデオを再トランスコーディングしたところ、出力は問題ないようでした。念のため、出力をmpdecimateフィルターにパイプすると、残りのすべてのフレームが「キープ」として検出されました。そのため、元のファイルは思ったほど混乱していませんでした。

7
Boann

余分なフレームが重複していて補間ではない場合、以下が機能する可能性があります。

ffmpeg -i orig.mp4 -an -vf "select='gt(scene\,0.001)',setpts=N/(10*TB)" -r 10 fixed.mp4

前のフレームの複製ではなく、すべてのフレームを選択するという考え方です。次に、指定された出力レートに従ってPTSが再生成されます。検出フィルターを正しく取得するには、シーンの値を上下に微調整する必要がある場合があります。ビデオがリアルタイムよりも速くまたは遅く表示される場合は、それぞれレートを下げるか上げます(および分母の値を設定します)。

2
Gyan