WebMからMP4へのffmpegの変換 - ファイルサイズを維持する方法?


0

次のパラメータを使用して、WebMファイルをMP4に変換しようとしています。

ffmpeg -loglevel info -i 2017-05-01-122851.webm -c:v libx264 -preset slower -crf 20 -bf 2 -trellis 2 -cmp 2 -subcmp 2 -g 45 -c:a aac -strict experimental -ab 32k ../renamed-video/2017-05-01-122851.mp4

ffmpeg version 3.0.7-0ubuntu0.16.10.1 Copyright (c) 2000-2017 the FFmpeg developers
  built with gcc 6.2.0 (Ubuntu 6.2.0-5ubuntu12) 20161005
  configuration: --prefix=/usr --extra-version=0ubuntu0.16.10.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --cc=cc --cxx=g++ --enable-gpl --enable-shared --disable-stripping --disable-decoder=libopenjpeg --disable-decoder=libschroedinger --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-libmodplug --enable-libmp3lame --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librubberband --enable-librtmp --enable-libschroedinger --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-libxvid --enable-libzvbi --enable-openal --enable-opengl --enable-x11grab --enable-libdc1394 --enable-libiec61883 --enable-libzmq --enable-frei0r --enable-chromaprint --enable-libx264
  libavutil      55. 17.103 / 55. 17.103
  libavcodec     57. 24.102 / 57. 24.102
  libavformat    57. 25.100 / 57. 25.100
  libavdevice    57.  0.101 / 57.  0.101
  libavfilter     6. 31.100 /  6. 31.100
  libavresample   3.  0.  0 /  3.  0.  0
  libswscale      4.  0.100 /  4.  0.100
  libswresample   2.  0.101 /  2.  0.101
  libpostproc    54.  0.100 / 54.  0.100
Input #0, matroska,webm, from '2017-05-01-122851.webm':
  Metadata:
    encoder         : GStreamer matroskamux version 1.8.3
    creation_time   : 2017-05-01 10:28:51
  Duration: 00:04:32.88, start: 0.000000, bitrate: 3160 kb/s
    Stream #0:0(eng): Video: vp8, yuv420p, 1280x720, SAR 1:1 DAR 16:9, 250 tbr, 1k tbn, 1k tbc (default)
    Metadata:
      title           : Video
    Stream #0:1(eng): Audio: vorbis, 44100 Hz, mono, fltp (default)
    Metadata:
      title           : Audio
File '../renamed-video/2017-05-01-122851.mp4' already exists. Overwrite ? [y/N] y
[libx264 @ 0x55d5e57dde80] using SAR=1/1
[libx264 @ 0x55d5e57dde80] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2
[libx264 @ 0x55d5e57dde80] profile High, level 5.1
[libx264 @ 0x55d5e57dde80] 264 - core 148 r2699 a5e06b9 - H.264/MPEG-4 AVC codec - Copyleft 2003-2016 - http://www.videolan.org/x264.html - options: cabac=1 ref=8 deblock=1:0:0 analyse=0x3:0x133 me=umh subme=9 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=0 trellis=2 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=6 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=2 b_pyramid=2 b_adapt=2 b_bias=0 direct=3 weightb=1 open_gop=0 weightp=2 keyint=45 keyint_min=4 scenecut=40 intra_refresh=0 rc_lookahead=45 rc=crf mbtree=1 crf=20.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to '../renamed-video/2017-05-01-122851.mp4':
  Metadata:
    encoder         : Lavf57.25.100
    Stream #0:0(eng): Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], q=-1--1, 250 fps, 16k tbn, 250 tbc (default)
    Metadata:
      title           : Video
      encoder         : Lavc57.24.102 libx264
    Side data:
      unknown side data type 10 (24 bytes)
    Stream #0:1(eng): Audio: aac (LC) ([64][0][0][0] / 0x0040), 44100 Hz, mono, fltp, 32 kb/s (default)
    Metadata:
      title           : Audio
      encoder         : Lavc57.24.102 aac
Stream mapping:
  Stream #0:0 -> #0:0 (vp8 (native) -> h264 (libx264))
  Stream #0:1 -> #0:1 (vorbis (native) -> aac (native))
Press [q] to stop, [?] for help
frame=  768 fps= 32 q=-1.0 Lsize=    2573kB time=00:00:03.20 bitrate=6576.7kbits/s dup=676 drop=0 speed=0.136x    

問題は、出力ファイルがソースファイルよりはるかに大きいということです。 2つのファイルが同じサイズ/定義になるようにサイズを調整するにはどうすればよいですか? さらに、私はこの警告を見ます、そして私はそれを恐れなければならないかどうかわかりません:

不明なサイドデータタイプ10(24バイト)。


2
あなたが同じサイズを達成したいならば、あなたは使うべきです 2パスとABR -c:v libx264 -preset slower -b:v <YOUR_BITRATE>k -pass <PASS_#> CRF(定率係数) 以前の平均ビットレートを知る方法がない(経験や試行錯誤以外の方法で)特定の画質を達成するために使用されます。
flolilolilo

1
@ liv913 -loglevel info がデフォルトなので、何もしません。追加する理由は何ですか -bf 2 -trellis 2 -cmp 2 -subcmp 2?これらのオプションはプリセットでカバーされています。
llogan

@floliloliloあなたは答えとして(もう少し説明をつけて)投稿するべきです。
slhck

@slhckが完了しました - 私は何も忘れていないと思います。 @ liv913それ以上のことは述べていますか unknown side data type 10 (24 bytes)?好き [libx264 0x123456] unknown side data type 10 (24 bytes) (もちろんこれは構成例です)。
flolilolilo

みんなありがとう。 @LordNeckbeard:プリセットがカバーするオプションのリストを見るにはどうすればいいですか? slower? helpコマンドを使う ffmpeg -hide_banner -f lavfi -i nullsrc -c:v libx264 -preset help -f mp4 - 私はプリセットのリストを見ることができるだけで、それらがするべきであることはできません。
liv913

回答:


3

あり -crf、あなたは本当に同じサイズを達成することはできません。 CRFは "Constant Rate Factor"を意味します - 0(ロスレス)から51(最悪の品質)までの無単位(no%、no kb / sなど)の値です(x264のデフォルト値:23)。 CRFの目的は特定の視覚的品質を達成することです ビットレートを定義する必要なし FFmpegのH.264ガイド 州:

[...]主観的に健全な範囲は18〜28です。 18は視覚的に無損失かそれに近いと考えてください。入力と同じように見えるはずですが、技術的に無損失ではありません。範囲は指数関数的であるため、CRF値+6を増加させるとビットレートの約半分になり、-6はビットレートの約2倍になります。

(エンコーダによって、CRF値の範囲が異なる場合があります。たとえば、 x265のデフォルトのCRF値は28です すべき 見た目はx264の23と同じです。

もちろんいじることができます -crf 目的のファイルサイズになるまで - ただし、これは通常多くの試行錯誤を意味します。エラー。


「品質が同じでx264が良いエンコーダであると思われるならば、 CRFがファイルを小さくしないのはなぜですか?

その質問への答えは簡単です:x264(市場に出回っている他のほとんどすべてのエンコーダのように)は入力ファイルがどれほど効率的にエンコードされたかを検出する方法がありません。それはそれが2 Mb / sのABR(平均ビットレート)を持っていることを知っているかもしれませんが、これは品質については何も言いません。そして、あなたの入力ファイルが十分にエンコードされていない(低ビットレートや非常に速いエンコーダ設定)場合、それはアーティファクト(ブロック、...)を持っているかもしれません。あなたはそれらを見ることができますが、x264は(実際には)そうすることができません [1] - そう述べることによって -crfつまり、新しいファイル内のすべてのアーティファクトを、値(0-51)で可能な範囲で節約したいと仮定します。これは、ノイズなどのアーティファクトを予測するのが簡単ではないため、より高いビットレートにつながります。

[1]レンガの壁を見るのが好きだと想像してください - 正方形のレンガの赤色とそれらの間の灰色のモルタルのためにそれをそのように認識することができますが、すべてのエンコーダは赤と灰色のピクセルです。


そのため、特定のファイルサイズを達成する方法はABRを使用することです。 これは -b:v FFmpegのパラメータ libx264。 ABRは可変ビットレート(VBR)で動作しますが、ファイル全体で指定されている平均ビットレートを達成しようとします。その原理をうまく機能させるためには、FFmpegが最初にファイルを調べてビットレートを計算し、それを2番目のステップでエンコードできるように2つのパスを使用する必要があります。

あなたの目的がinput-fileと同じサイズの結果ファイルを持つことであれば、 あなたはこのようにあなたのビットレートを計算することができます

(<FILESIZE_INPUT-FILE> [MiB] * 8192) / <DURATION_INPUT-FILE> [seconds] = ~XYZ [kBit/s total bitrate]
XYZ [kBit/s total bitrate] - <DESIRED_AUDIO_BITRATE> [kBit/s] = ___ [kBit/s video bitrate]

の注釈 [brackets]、あなたが記入する値 <ANGLE_BRACKETS>、そしてあなたの結果は ___ アンダースコアの行。

結果の構文は次のとおりです。

ffmpeg -y -i <INPUT-FILE-PATH> -c:v libx264 -b:v ___k -preset slower <OTHER_COMMANDS_LIKE_AUDIO> -pass 1 -f <OUTPUT-FILE-FORMAT> /dev/null && \
ffmpeg -y -i <INPUT-FILE-PATH> -c:v libx264 -b:v ___k -preset slower <OTHER_COMMANDS_LIKE_AUDIO> -pass 2 <OUTPUT-FILE-PATH>

x264では、CRFとABRは相互に排他的です - どちらか一方を使うことができるので、x264での選択は常に品質保証対ファイルサイズ保証のどちらかになります。私の知る限りでは、他のエンコーダ( x 265のように )はABRとCRFの組み合わせを使用できるため、エンコーダが達成しようとするビットレートと品質範囲を指定できます。ただし、常に優先させることができるのは、視覚品質またはターゲットファイルサイズ(またはエンコード速度)だけです。多くの経験を積むことで、どんな仕事でも「完璧なバランス」を達成することができますが、それでも妥協することになります。


ffmpegのパラメータに関する最後のコメント:

パラメータが必要ない場合( そしてそれらが必要となる機会はたくさんあります )指定しないでください。 -loglevel info デフォルトですが、なぜそれを指定するのですか?それができる最善のことはあなたがそれにタイプミスがあるならあなたのコードを壊すことです(同じことが同じです) -trellis )また、 libx264 GOPを指定するのに良い仕事をしているので、 -g 特定の再生エンジンに必要な場合以外は必要ないかもしれません -cmp そして -csubcmp

エンコーダの開発者は通常、製品の使用を簡単にすることを試みるので、ほとんどの場合デフォルト値は、インターネット上の誰かが最初の文書で見つけた10年前のランダムなパラメータを盲目的に入力するよりはるかに優れています。

もちろん、あなたがあなたの研究をしたことがあり、あなたがその経験を持っている(あるいはあなたがそれを試してみたい)のであれば、ffmpegでコマンドコンソールの文字数制限に行かないようにしたくありません!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.