このコマンドを使用してフレームを抽出すると、次のようなことがわかりました。
ffmpeg -i sample_nosound.mp4 $filename%03d.jpg
デフォルトでは fps に基づいて抽出されます。ffmpeg -i sample_nosound.mp4
ビデオは6fpsのフレームレートで表示されるため、1630jpgフレームを抽出します。ここで、1630/6 = 271.6秒は、ビデオ全体の期間の4:32と同じです。
しかし、1630 jpgフレームの合計サイズは13MBです。
$ du -h extracted_jpg_folder
13M extracted_jpg_folder
、mp4のファイルサイズは1.8MBで、フルフレームサイズよりはるかに小さいです。
$ ls -la sample_nosound.mp4
-rw-rw-r-- 1 xiaobai xiaobai 1814889 Feb 13 15:42 'sample_nosound.mp4'
これは、ffmpegが繰り返されるフレームのfps情報を参照してフレームを抽出することを意味します。
だから私の質問は、fpsに依存せずに「保存されたフレーム」を介してffmpeg抽出フレームをどのように作成できますか?
フルフレームサイズがmp4ファイルサイズとほぼ同じになることを願っています。
mp4にはいくつかのメタデータが含まれる可能性があるため、正確なファイルサイズの一致を期待するものではありません。
出力ffprobe -i sample_nosound.mp4
:
ffprobe version 3.4.4-0ubuntu0.18.04.1 Copyright (c) 2007-2018 the FFmpeg developers
built with gcc 7 (Ubuntu 7.3.0-16ubuntu3)
configuration: --prefix=/usr --extra-version=0ubuntu0.18.04.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-librsvg --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared
WARNING: library configuration mismatch
avcodec configuration: --prefix=/usr --extra-version=0ubuntu0.18.04.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-librsvg --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared --enable-version3 --disable-doc --disable-programs --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libtesseract --enable-libvo_amrwbenc
libavutil 55. 78.100 / 55. 78.100
libavcodec 57.107.100 / 57.107.100
libavformat 57. 83.100 / 57. 83.100
libavdevice 57. 10.100 / 57. 10.100
libavfilter 6.107.100 / 6.107.100
libavresample 3. 7. 0 / 3. 7. 0
libswscale 4. 8.100 / 4. 8.100
libswresample 2. 9.100 / 2. 9.100
libpostproc 54. 7.100 / 54. 7.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'sample_nosound.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf57.83.100
Duration: 00:04:32.00, start: 0.000000, bitrate: 53 kb/s
Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p(tv, bt470bg/bt709/bt709), 640x330 [SAR 1:1 DAR 64:33], 53 kb/s, 6 fps, 6 tbr, 12288 tbn, 12 tbc (default)
Metadata:
handler_name : VideoHandler
ベストアンサー1
質問を理解したら、ビデオからフレームを抽出したいと思います。各フレームは別々のファイルに保存する必要があります。すべてのファイルサイズの合計はビデオファイルサイズと一致する必要があります。これは特定のビデオでのみ機能します。幅広く説明しようとします。
長い話を短く
h264でエンコードされたビデオでは、同じビジュアル品質とファイルサイズのフレームを抽出できません。
混乱したビデオコンテナ形式
この例のビデオファイルはMP4ファイルです。 MP4はビデオデータのコンテナです。しかし、コンテナの種類は実際の内容について実際に何も言わない。実は種類も多様です。ビデオフォーマットzipアーカイブ(またはPDFファイル)のようにMP4ファイルに常駐できます。
さまざまな種類の画像があります。
ビデオは画像の連続です。これらの画像をビデオストリームに保存する方法(エンコード)と、後で読み取る方法(デコード)はいくつかあります。これらのアルゴリズムはしばしば呼び出されます。コーデック。
すべてのコーデックが圧縮されるわけではありません。この例では、h264 がコーデックです。デフォルトでは、h264エンコーダは1フレームと次のフレームの差を計算します。エンコーダは、差が小さい場合にのみ差分を保存します。実際のフレームが削除されます。最初のフレームのみが完全な画像として保存されます。これは多くのスペースを節約し、圧縮戦略の1つです。 h264 デコーダは、保存された相違を前のフレームに適用して元のフレームを再生成します。
ご覧のとおり、ビデオのフレームは互いに依存しています。個々のファイルが必要な場合は、独立したいと思います。これは、常に各単一フレームに関する完全な情報を保存する必要があることを意味します。これは、単に既存のデータをインポートしてファイルにコピーすることはできず、代わりにビデオを再エンコードする必要があることを意味します。このプロセスでは、ファイル全体のサイズを大きくする必要があります。
いろいろ読めるよビデオ圧縮の写真の種類、特に「違いに基づいて」インターフレームまたはビデオ圧縮の一般的な概要。
h264はJPEGではありません。
個々のイメージについて話しても。 JPEGはいわゆる話すものを使用します。離散コサイン変換。 H.264似ているが改善されたバージョンを使用してください。つまり、JPEGはh264ほど効率的に圧縮できません。さて、次のようにh264圧縮画像をファイルに入れることができます。半分(これは本質的にシングルフレームビデオのようなものです)。
'それは完全に真実ではありませんが、今は簡単に保ちたいです。実際には「シーンの最初のフレーム」に似ています。詳細を知りたい場合は、
エンコーダは各シーンの先頭を認識します(映画撮影ではこれをしばしば「カット」と呼びます)。フレーム間の違いは非常に大きいため、圧縮には役立ちません。エンコーダは、「差分ベース」のインターフレームを使用しないことにしました。代わりに完全な画像を使用します(これは「イントラフレーム」、「キーフレーム」とも呼ばれます)。
技術的な理由もあります。フレーム内でのみビデオを検索すると、すばやく移動できます。したがって、イントラフレームも時々(実際のビデオコンテンツに関係なく)ストリームに追加されます。通常、ビデオには毎秒1つのイントラフレームがあります。
今、私たちはビデオ圧縮について多くを知っています。このビデオではいくつかのことを紹介します。
このビデオにはファイルの破損によりイントラフレームはありません。デコーダはある程度正常に再生します。足りない映像には、女性が横を見つめている様子が現れることがあります。彼女が頭を回すと、デコーダにはいくつかの動作情報を含むフレーム間のデータしかありません。女性が頭の横に顔を当てて終わったようです。その間、一人の男が背景を横切って歩いていく。足りないフレームに人が出てこなくて大丈夫に見えます。