FFmpeg/ffv1.3/mkvがロスレスビデオを作成することは可能ですか(もしそうなら、どのように)、そうでない場合、サイズに近づくための良い代替手段は何ですか?ビデオはロスレスでなければなりません。
FFmpegを使用して、類似したjpeg画像(Webカメラからの画像)のセットにffv1.3でmkvを作成しようとしています。ビデオを作成することはできますが、jpeg画像のコレクションの少なくとも2倍のサイズです。ほぼ同じレベル以上の圧縮を期待していました。
Jpeg自体が圧縮用に最適化されていることを理解しています。ただし、非常に類似した画像の大規模なセットは、さらに圧縮できる必要があります。この場合は、元の画像を合計したものと類似しています。
ファイルの作成に使用しているコマンドは次のとおりです。
ffmpeg -pattern_type glob -i '* .jpg' -vcodec ffv1 -level 3 -an -pass 1 -passlogfile passlog -f matroska/dev/null
ffmpeg -pattern_type glob -i '* .jpg' -vcodec ffv1 -level 3 -an -pass 2 -passlogfile passlog -f matroska〜/foo.mkv
入力ファイルは合計24Mですが、結果のmkvは96M(du -hあたり)です。
2番目のパスの結果:
ffmpeg version N-79053-g7eedad9 Copyright (c) 2000-2016 the FFmpeg developers
built with gcc 4.6 (Debian 4.6.3-14+rpi1)
configuration: --enable-cross-compile --cross-prefix= --Arch=armel --target-os=linux --prefix=/my/path/were/i/keep/built/arm/stuff
libavutil 55. 19.100 / 55. 19.100
libavcodec 57. 28.103 / 57. 28.103
libavformat 57. 28.101 / 57. 28.101
libavdevice 57. 0.101 / 57. 0.101
libavfilter 6. 39.102 / 6. 39.102
libswscale 4. 0.100 / 4. 0.100
libswresample 2. 0.101 / 2. 0.101
Input #0, image2, from '*.jpg':
Duration: 00:00:21.32, start: 0.000000, bitrate: N/A
Stream #0:0: Video: mjpeg, yuvj422p(pc, bt470bg/unknown/unknown), 640x480, 25 fps, 25 tbr, 25 tbn, 25 tbc
File '/home/pi/foo.mkv' already exists. Overwrite ? [y/N] y
[swscaler @ 0x3671f30] deprecated pixel format used, make sure you did set range correctly
Output #0, matroska, to '/home/pi/foo.mkv':
Metadata:
encoder : Lavf57.28.101
Stream #0:0: Video: ffv1 (FFV1 / 0x31564646), yuv422p, 640x480, q=2-31, pass 2, 200 kb/s, 25 fps, 1k tbn, 25 tbc
Metadata:
encoder : Lavc57.28.103 ffv1
Stream mapping:
Stream #0:0 -> #0:0 (mjpeg (native) -> ffv1 (native))
Press [q] to stop, [?] for help
frame= 533 fps=4.2 q=-0.0 Lsize= 97815kB time=00:00:21.32 bitrate=37584.4kbits/s speed=0.168x
video:97808kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.006607%
各jpegは約43143バイト(ls -alあたり)ですが、次のコマンドを実行すると、ツールは各画像が614400バイト(ビデオと独立したjpeg画像の両方)であることを示します。これが画像の非圧縮サイズ(640x480x2)だと思います。
ffmpeg -pattern_type glob -i '* .jpg' -f framemd5-
以下の結果は画像のものであり、同じサイズがmkvについて報告されています。
ffmpeg version N-79053-g7eedad9 Copyright (c) 2000-2016 the FFmpeg developers
built with gcc 4.6 (Debian 4.6.3-14+rpi1)
configuration: --enable-cross-compile --cross-prefix= --Arch=armel --target-os=linux --prefix=/my/path/were/i/keep/built/arm/stuff
libavutil 55. 19.100 / 55. 19.100
libavcodec 57. 28.103 / 57. 28.103
libavformat 57. 28.101 / 57. 28.101
libavdevice 57. 0.101 / 57. 0.101
libavfilter 6. 39.102 / 6. 39.102
libswscale 4. 0.100 / 4. 0.100
libswresample 2. 0.101 / 2. 0.101
Input #0, image2, from '*.jpg':
Duration: 00:00:21.32, start: 0.000000, bitrate: N/A
Stream #0:0: Video: mjpeg, yuvj422p(pc, bt470bg/unknown/unknown), 640x480, 25 fps, 25 tbr, 25 tbn, 25 tbc
#format: frame checksums
#version: 1
#hash: MD5
#software: Lavf57.28.101
#tb 0: 1/25
#stream#, dts, pts, duration, size, hash
Output #0, framemd5, to 'pipe:':
Metadata:
encoder : Lavf57.28.101
Stream #0:0: Video: rawvideo (Y42B / 0x42323459), yuvj422p, 640x480, q=2-31, 200 kb/s, 25 fps, 25 tbn, 25 tbc
Metadata:
encoder : Lavc57.28.103 rawvideo
Stream mapping:
Stream #0:0 -> #0:0 (mjpeg (native) -> rawvideo (native))
Press [q] to stop, [?] for help
0, 0, 0, 1, 614400, 2148ff8b95296f4bacc1099d13235063
0, 1, 1, 1, 614400, da330e2acd2f7d7a1e79fe79fccc90cf
0, 2, 2, 1, 614400, f55563c13a9f232ce32419fa26e37214
0, 3, 3, 1, 614400, c53d994fff0a9b26529fa8763deae520
編集:最高の圧縮(および良好な速度)は、jpeg画像自体のコンテナから得られました:
ffmpeg -pattern_type glob -i '* .jpg' -vcodec copy -an -f matroska〜/foo.mkv
結果のファイルは24Mをわずかに超えていました(96M ffv1に対して)。また、解凍されたjpeg画像は312Mで、どちらの場合もかなりよく圧縮されていました。 jpeg以外のものから始めた場合は、ffv1が理想的でしたが、私の場合は、損失のないjpegであり、損失のない初期画像もあります。
一般的に、不可逆コーデックを使用して不可逆ビデオをエンコードすると、ファイルサイズが大きくなることがわかりました。 FFmpegは、ffv1にエンコードする前に入力を解凍する必要があるため、非圧縮バージョンのjpegから機能します。プロセスの概要は次のとおりです: https://ffmpeg.org/ffmpeg.html#Detailed-description