だから、私は自分の答えを長すぎてしまった。
TL; DRサマリー:画像のシーケンスをロスレスに保存するには、libx264
またはlibx264rgb
を使用し-preset ultrafast -qp 0
ます。ffvhuffとほぼ同じ速度で、ビットレートははるかに低く、デコードも高速です。 huffyuv
はffmpegの外部でより広くサポートされていますが、ほど多くのピクセル形式をサポートしていませんffvhuff
。したがって、これは、他のツールがHigh 4:4:4 Predictive
x264がロスレスモードで使用するh.264 プロファイルを処理できると仮定して、h.264を使用するもう1つの理由です。x264は、任意のフレームへの高速ランダムアクセスが必要な場合にイントラのみを実行できます。
イメージのディレクトリから読み込むときに、libx264rgbに影響するffmpegのバグに注意してください。(そして、誰が他のどのようなケースを知っているか。)使用する前に、セットアップのロスレスをテストしてください。(ffmpeg -i in -pix_fmt rgb24 -f framemd5
オンソースで簡単、ロスレス圧縮))
編集:utvideo
エンコードとデコードはかなり高速で、h.264よりもはるかに簡単なコーデックです。基本的にはhuffyuv
、より便利な色空間のサポートを備えたモダンです。h.264で問題が発生した場合は、一時ファイルについてutvideo nextを試してください。
edit2:RGBコーデックとしてのPNGは、少なくともSintel予告編ではうまくいくようです。
同様の質問に対する私の同様の回答も参照してください:https :
//superuser.com/a/860335/20798
Warren Youngのさまざまな生のフォーマットとコーデックに関する回答には多くの情報があります。答えが短いとより便利だと思うので、新しい答えを作っています。ロスレスx264またはffvhuffをサポートしていないソフトウェアを使用している場合、その情報の一部はおそらく有用です。
このコンテキストでの「ロスレス」の最も便利な定義は、ビット単位で入力を回復できることです。何をするかに関係なく、ビデオエンコーディングの品質が低下する心配はありません。
http://en.wikipedia.org/wiki/Chroma_subsampling
理想的には、複数の色空間変換を避ける。丸め誤差は蓄積される可能性があります。RGBカラースペースで機能するフィルターを使用してビデオを操作する場合、高ビットレートが問題にならない限り、RGBを維持することは理にかなっています。おそらく最終的にはyuv 4:2:0
ビデオを作成することになるでしょうが、適用するフィルターによっては、追加のクロマ解像度を維持することが潜在的に有用です。
いずれかの方法で、ロスレスx264の、サポートRGBとYUVの両方ffvhuff 4:4:4
、4:2:2
と4:2:0
。デコードが速いので、x264をお勧めします。RGB HDビデオをリアルタイムで再生しようとしている場合、xvではなくopenglを試してください。私のシステムのxvはyuv入力のみを受け入れるためです。mplayerは、色空間の変換に余分なCPU時間を使用していました。
以下のエンコーダ・テスト用のソース:https://media.xiph.org/。 https://media.xiph.org/sintel/sintel_trailer-1080-png.tar.gz 彼らはsintelトレーラー用のy4mファイルをgzipするのを忘れていたため、png tarballは実際にはずっと小さくなっています。
ffmpeg -i 1080/sintel_trailer_2k_%4d.png -i sintel_trailer-audio.flac \
-c:a copy -c:v libx264rgb -preset ultrafast -qp 0 \
frompng.sintel.264rgb.mkv
例えば
peter@tesla:/mnt/GP1TB/p/encoder-sample/sintel$ time ffmpeg -i 1080/sintel_trailer_2k_%4d.png -i sintel_trailer-audio.flac -c:a copy -c:v libx264rgb -preset ultrafast -qp 0 frompng.sintel.264rgb.mkv
ffmpeg version N-67983-g2b358b4 Copyright (c) 2000-2015 the FFmpeg developers
built on Jan 10 2015 05:32:37 with gcc 4.8 (Ubuntu 4.8.2-19ubuntu1)
configuration: --enable-gpl --enable-version3 --enable-nonfree --disable-doc --disable-ffserver --enable-libx264 --enable-libx265 --enable-libmp3lame --enable-libopus --enable-libwebp --enable-libvpx --disable-outdev=oss --disable-indev=oss --disable-encoder=vorbis --enable-libvorbis --enable-libfdk-aac --disable-encoder=aac --disable-decoder=jpeg2000
libavutil 54. 16.100 / 54. 16.100
libavcodec 56. 20.100 / 56. 20.100
libavformat 56. 18.100 / 56. 18.100
libavdevice 56. 3.100 / 56. 3.100
libavfilter 5. 7.100 / 5. 7.100
libswscale 3. 1.101 / 3. 1.101
libswresample 1. 1.100 / 1. 1.100
libpostproc 53. 3.100 / 53. 3.100
Input #0, image2, from '1080/sintel_trailer_2k_%4d.png':
Duration: 00:00:50.12, start: 0.000000, bitrate: N/A
Stream #0:0: Video: png, rgb24, 1920x1080 [SAR 72:72 DAR 16:9], 25 fps, 25 tbr, 25 tbn, 25 tbc
Input #1, flac, from 'sintel_trailer-audio.flac':
Duration: 00:00:52.00, start: 0.000000, bitrate: 721 kb/s
Stream #1:0: Audio: flac, 48000 Hz, stereo, s16
File 'frompng.sintel.264rgb.mkv' already exists. Overwrite ? [y/N] y
No pixel format specified, rgb24 for H.264 encoding chosen.
Use -pix_fmt yuv420p for compatibility with outdated media players.
[libx264rgb @ 0x2770760] using SAR=1/1
[libx264rgb @ 0x2770760] using cpu capabilities: MMX2 SSE2Fast SSSE3 Cache64 SlowShuffle
[libx264rgb @ 0x2770760] profile High 4:4:4 Predictive, level 4.0, 4:4:4 8-bit
[libx264rgb @ 0x2770760] 264 - core 144 r2525+2 6a4fca8 - H.264/MPEG-4 AVC codec - Copyleft 2003-2014 - http://www.videolan.org/x264.html - options: cabac=0 ref=1 deblock=0:0:0 analyse=0:0 me=dia subme=0 psy=0 mixed_ref=0 me_range=16 chroma_me=1 trellis=0 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=0 chroma_qp_offset=0 threads=3 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=0 weightp=0 keyint=250 keyint_min=25 scenecut=0 intra_refresh=0 rc=cqp mbtree=0 qp=0
Output #0, matroska, to 'frompng.sintel.264rgb.mkv':
Metadata:
encoder : Lavf56.18.100
Stream #0:0: Video: h264 (libx264rgb) (H264 / 0x34363248), rgb24, 1920x1080 [SAR 72:72 DAR 16:9], q=-1--1, 25 fps, 1k tbn, 25 tbc
Metadata:
encoder : Lavc56.20.100 libx264rgb
Stream #0:1: Audio: flac ([172][241][0][0] / 0xF1AC), 48000 Hz, stereo (16 bit)
Stream mapping:
Stream #0:0 -> #0:0 (png (native) -> h264 (libx264rgb))
Stream #1:0 -> #0:1 (copy)
Press [q] to stop, [?] for help
frame= 1253 fps= 18 q=-1.0 Lsize= 834790kB time=00:00:51.96 bitrate=131592.5kbits/s
video:830198kB audio:4575kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.002025%
[libx264rgb @ 0x2770760] frame I:6 Avg QP: 0.00 size:612470
[libx264rgb @ 0x2770760] frame P:1247 Avg QP: 0.00 size:678787
[libx264rgb @ 0x2770760] mb I I16..4: 100.0% 0.0% 0.0%
[libx264rgb @ 0x2770760] mb P I16..4: 50.3% 0.0% 0.0% P16..4: 12.0% 0.0% 0.0% 0.0% 0.0% skip:37.6%
[libx264rgb @ 0x2770760] coded y,u,v intra: 71.1% 68.2% 70.0% inter: 22.8% 22.8% 23.2%
[libx264rgb @ 0x2770760] i16 v,h,dc,p: 50% 48% 1% 1%
[libx264rgb @ 0x2770760] kb/s:135693.94
-r 24
fps を指定するのを忘れたため、オーディオとのv同期が維持されないことに注意してください。(およびビットレート(ファイルサイズではありません)の数値もオフになります。ffmpegのデフォルトは25fpsです)。このマシンのCPUは、第1世代(conroe)core2duo 2.4GHz(E6600)です。
結果:
4.5M sintel_trailer-audio.flac # this is muxed in to every mkv
948M 1080 # the directory of PNGs
940M /var/tmp/dl/sintel_trailer-1080-png.tar.gz
7434M sintel.y4m # yuv444, uncompressed. mplayer gets the colors wrong?
2342M qtrle.mkv # encode went at 16fps, so qtrle is slower and worse filesize
2105M sintel.huff.mkv # ffvhuff with default options, rgb pix fmt
1228M sintel.utvideo.mkv # muxed without audio, I should update the others this way
946M png-copy.mkv # -codec copy makes a MPNG stream. Use -codec png for non-png sources, but it won't make PNGs as small. Decodes very fast
824M lossy.prores_ks.mov # yuv444p10le extremely slow to encode (2.3fps), and worse bitrate.
816M frompng.sintel.264rgb.mkv
735M sintel.x264rgb.medium.nocabac.mkv # encode went at 3.3 fps instead of 18. Better gain than for live-action, though
626M sintel_trailer.rgb.lossless.veryslow.mkv # 1.1fps. With CABAC, 16 ref frames, etc. etc.
512M lossy.prores.mov # yuv422p10le, 12fps
341M sintel.yuv420.x264.lossless.mkv
21M lossy.rgb.crf26.preset=medium.mkv
13M lossy.yuv420.crf26.preset=medium.mkv # remember this is WITH 4.5MB audio
mediainfo
RGB h.264を知らないことに注意してください、それでもファイルがYUVであると言います。
本当にロスレスであることを確認してください:
ffmpeg -i 1080/sintel_trailer_2k_%4d.png -f framemd5 png.framemd5
ffmpeg -i fromhuff.sintel.264rgb.mkv -an -sn -pix_fmt rgb24 -f framemd5 x264rgb.framemd5
diff -s *.framemd5
Files png.framemd5 and x264rgb.framemd5 are identical
そのため、元のPNG入力をそのように復元できます。つまり、同一の画像データを含むPNGを作成できます。
-pix_fmt rgb24
x264テストに注意してください。ffmpegのh.264デコーダーはgbrp(平面、パックではない)出力を出力するため、ビットは同じですが、順序は異なります。framemd5の「コンテナ」は、何らかの形式の制限を課しませんが、ビットが同じように配置されている場合にのみ同じmd5を取得します。私はffmpegがPNGをフィードするときにpix fmtに使用していることを見て、それ-pix_fmt
をデコードの引数として使用しました。ちなみに、これがvlcがRGB h.264ファイルを再生しない理由です(次のリリースまで、または現在のナイトリービルドまで):gbrpピクセル形式をサポートしていません。
yuvの使用libx264
ではなくlibx264rgb
。x264のRGBバージョンをインストールする必要はありません。実際のライブラリは両方をサポートしています。2つの異なる名前のエンコーダーとして実装したのは、ffmpegだけです。彼らがそうしなかった場合、デフォルトの動作は、rgb入力をrgbのままにして、同じ品質ではるかに高いビットレート出力を生成しながら、本当にゆっくり実行することだと思います。(必要に-pix_fmt yuv420p
応じて420
、444
h.264出力の代わりに使用する必要がある場合があります。
長期保存用のファイルを作成する場合-preset ultrafast
を除き、常にロスレスx264に使用してください。参照フレームとモーション検索を増やしても、ロスのない、アニメーションのないノイズのある素材ではほとんど違いがありません。CABACは、デコードにも、ロスレスビットレートで大量のCPUを使用します。スクラッチファイルではなく、アーカイブ目的でのみ使用します。(ultrafastはCABACを無効にします)。CABACは、ビットレートを10〜15%節約します。
すべてのフレームをキーフレームにする必要がある場合は、を設定し-keyint 1
ます。次に、キーフレームまたはw / eのみをカットしたいビデオ編集ソフトウェアは、あなたを制限しません。
元の質問に答えるには:これは、段階的に物事を試みている間に一時ファイルを回すためにすべきことです(例:遅いインターレース解除、他の物事を試みる前にロスレス出力を保存する):
ffmpeg -i dv-video-source.ts -vf yadif=2:1,mcdeint=3:1:10 -c:a copy -c:v libx264 -preset ultrafast -qp 0 deinterlaced.mkv
静止画像ツールで変更できる画像ファイルの出力が本当に必要な場合は、必ずpngにデコードしてください。各ピクセルのY、Cb、Crの各値の8ビットの最下位ビットよりも多くのものを失うことはありません。
これはx264が本当にうまく機能する理由は、テキストが少し入った多くの黒いフレーム、フェードインとフェードアウト、および多くのフレームの大きな領域間の完全な類似性があるため-preset ultrafast
です。実写では、まだffvhuff(yuv420)の半分のファイルサイズでx264が表示されます。
好奇心anyone盛な人向け:高CPU時間ロスレスrgbエンコードには(x264コア144 r2525)がありました:
[libx264rgb @ 0x35b97a0] frame I:27 Avg QP: 0.00 size:604367
[libx264rgb @ 0x35b97a0] frame P:1226 Avg QP: 0.00 size:517512
[libx264rgb @ 0x35b97a0] mb I I16..4..PCM: 46.3% 38.1% 15.7% 0.0%
[libx264rgb @ 0x35b97a0] mb P I16..4..PCM: 24.3% 5.4% 4.5% 0.0% P16..4: 10.5% 3.3% 5.7% 0.0% 0.0% skip:46.3%
[libx264rgb @ 0x35b97a0] 8x8 transform intra:17.3% inter:46.1%
[libx264rgb @ 0x35b97a0] coded y,u,v intra: 81.6% 77.5% 80.0% inter: 28.0% 27.7% 28.1%
[libx264rgb @ 0x35b97a0] i16 v,h,dc,p: 35% 64% 1% 0%
[libx264rgb @ 0x35b97a0] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 31% 49% 13% 2% 1% 1% 1% 1% 1%
[libx264rgb @ 0x35b97a0] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 31% 37% 5% 5% 6% 5% 5% 4% 3%
[libx264rgb @ 0x35b97a0] Weighted P-Frames: Y:41.1% UV:40.7%
[libx264rgb @ 0x35b97a0] ref P L0: 74.5% 4.2% 9.1% 4.1% 2.1% 1.7% 1.2% 0.8% 0.6% 0.5% 0.3% 0.2% 0.2% 0.2% 0.2% 0.1%
[libx264rgb @ 0x35b97a0] kb/s:99721.66
加重pフレームの非常に高い割合、およびスキップマクロブロックの非常に高い割合に注意してください。すべてのシーンのトランジションはカットではなくフェードであり、x264にCPU時間を与えて方法を把握すれば利用できます。
詳細注記(編集用の損失のあるコーデック):
クリップを介して前方/後方にスクラブするには、通常、イントラのみのコーデックが適しています(utvideo、ffvhuff、mjpeg、jpeg2000、pro-res、AVC-Intra)。短いGOP(1/2〜1秒)の通常のAVCも、ソフトウェアが何をしているのかを知っていれば(スクラブ時に最も近いIフレームをデコードし、GOP内でデコードして、必要に応じてタイムラインで十分にズームインしている場合はインターフレーム)。
これとhttps://video.stackexchange.com/に、「ロスレスコーデックよりも圧縮速度が遅く、品質が悪い場合のポイント」など、pro-resについて否定的なことを投稿しましたが、いくつかの興味深い機能があります。 Appleは、フルレゾのデコードのCPU時間のわずか1/3を使用して、ハーフ解像度でデコードできると述べています。
ffmpegのprores実装は、おそらくAppleの場合ほど速度が最適化されていないため、ffmpegでテストした結果、速度が遅くなりました。ffmpegに基づくツールを使用したフリーソフトウェアワークフローがある場合は、おそらく使用する価値はありませんが、商用ソフトウェアを使用している場合は試してみる価値があります。
私は多くのビデオ編集をしていません。ほとんどはエンコードだけです。だから、proresのようなコーデックにどのようなテストが適切であるかについてはよくわかりません。short-GOP x264がうまく機能しない場合は、mjpegが高速な代替手段になると思います。Linuxディストリビューションにはasmで高速化されたjpegの実装があり、非常にシンプルなコーデックです。必要に応じて品質を上げたり下げたりして、品質とファイルサイズ+エンコード/デコード速度のトレードオフを図ることができます。古くからありますが、本当に高速なイントラ専用コーデックが必要な場合は、x264を上回る可能性があります。
x264の場合、x264 --crf 10 --keyint=1 --preset superfast --tune fastdecode
(イントラのみ、--avcintra-class
設定する他のものは一切使用しません。)注superfast
(CABACなし)、またはがfaster
、ultrafast
損失のある操作にはおそらく最適ではありません。超高速はそれほど速くなくても多くの品質を失うと思います。より低い品質(より高いcrf)を使用するほど、より良いエンコードを見つけるためにCPU時間をもう少し費やす価値があります。ただし、この多くはおそらくGOPサイズ= 1には関係ありません。
GOPサイズ> 1で、エンコードで非常に多くのビットを投げている場合、残差をエンコードするときにより良いインター予測では多くのビットを保存しません(フレーム間のノイズ/粒子/微妙な変化が非常に正確に保持されるため)おそらく超高速で十分です。そうでなければ、--keyint=30
おそらく、何か--preset veryfast --crf 12
が面白いでしょう。
理論的には、所定のCRF設定での品質はプリセット間で一定でなければなりません。小さいファイル(高速なデコード)を探している場合、品質とエンコード時間のトレードオフは理にかなっています。
ffmpeg -i input.avi -c:v qtrle -pix_fmt rgb24 output.mov
。