web-dev-qa-db-ja.com

jpeg画像でFFmpegffv1を使用したロスレスビデオは圧縮されませんが拡張されます

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であり、損失のない初期画像もあります。

1
user1373984

一般的に、不可逆コーデックを使用して不可逆ビデオをエンコードすると、ファイルサイズが大きくなることがわかりました。 FFmpegは、ffv1にエンコードする前に入力を解凍する必要があるため、非圧縮バージョンのjpegから機能します。プロセスの概要は次のとおりです: https://ffmpeg.org/ffmpeg.html#Detailed-description

0
Tandy Freeman