なぜWMVをMP4に変換するのがとても遅いのですか?


12

FFmpegでビデオをWMVからMP4に変換しようとしていますが、数時間かかります。AVIに変換しようとすると、約10〜15分しかかかりません。

ffmpegバージョン

ffmpeg version N-43206-gf857465
built on Aug  4 2012 16:10:39 with gcc 4.7.1 (GCC)

MP4への変換

ffmpeg -i input.wmv -vcodec libx264 output.mp4

libavutil      51. 66.100 / 51. 66.100
  libavcodec     54. 49.100 / 54. 49.100
  libavformat    54. 22.100 / 54. 22.100
  libavdevice    54.  2.100 / 54.  2.100
  libavfilter     3.  5.102 /  3.  5.102
  libswscale      2.  1.100 /  2.  1.100
  libswresample   0. 15.100 /  0. 15.100
  libpostproc    52.  0.100 / 52.  0.100
Input #0, asf, from 'input.wmv':
  Metadata:
    WMFSDKVersion   : 12.0.7601.17514
    WMFSDKNeeded    : 0.0.0.0000
    IsVBR           : 0
    encoder         : Lavf54.22.100
  Duration: 01:14:23.06, start: 0.000000, bitrate: 324 kb/s
    Stream #0:0: Video: msmpeg4 (MP43 / 0x3334504D), yuv420p, 1280x720, 15 tbr,
1k tbn, 1k tbc
[libx264 @ 03427620] using cpu capabilities: MMX2 SSE2Fast SSSE3 FastShuffle Cac
he64
[libx264 @ 03427620] profile High, level 3.1
[libx264 @ 03427620] 264 - core 125 r2208 d9d2288 - H.264/MPEG-4 AVC codec - Cop
yleft 2003-2012 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deb
lock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 m
e_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chro
ma_qp_offset=-2 threads=3 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 i
nterlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1
b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=15 scenec
ut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=
0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to 'output.mp4':
  Metadata:
    WMFSDKVersion   : 12.0.7601.17514
    WMFSDKNeeded    : 0.0.0.0000
    IsVBR           : 0
    encoder         : Lavf54.22.100
    Stream #0:0: Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 1280x720, q=-1--
1, 15 tbn, 15 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (msmpeg4 -> libx264)

MP4への変換 copy

ffmpeg -i input.wmv -c:v:1 copy output.mp4

  libavutil      51. 66.100 / 51. 66.100
  libavcodec     54. 49.100 / 54. 49.100
  libavformat    54. 22.100 / 54. 22.100
  libavdevice    54.  2.100 / 54.  2.100
  libavfilter     3.  5.102 /  3.  5.102
  libswscale      2.  1.100 /  2.  1.100
  libswresample   0. 15.100 /  0. 15.100
  libpostproc    52.  0.100 / 52.  0.100
Input #0, asf, from 'input.wmv':
  Metadata:
    WMFSDKVersion   : 12.0.7601.17514
    WMFSDKNeeded    : 0.0.0.0000
    IsVBR           : 0
    encoder         : Lavf54.22.100
  Duration: 01:14:23.06, start: 0.000000, bitrate: 324 kb/s
    Stream #0:0: Video: msmpeg4 (MP43 / 0x3334504D), yuv420p, 1280x720, 15 tbr,
1k tbn, 1k tbc
[libx264 @ 03437620] using cpu capabilities: MMX2 SSE2Fast SSSE3 FastShuffle Cac
he64
[libx264 @ 03437620] profile High, level 3.1
[libx264 @ 03437620] 264 - core 125 r2208 d9d2288 - H.264/MPEG-4 AVC codec - Cop
yleft 2003-2012 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deb
lock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 m
e_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chro
ma_qp_offset=-2 threads=3 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 i
nterlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1
b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=15 scenec
ut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=
0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to 'output.mp4':
  Metadata:
    WMFSDKVersion   : 12.0.7601.17514
    WMFSDKNeeded    : 0.0.0.0000
    IsVBR           : 0
    encoder         : Lavf54.22.100
    Stream #0:0: Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 1280x720, q=-1--
1, 15 tbn, 15 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (msmpeg4 -> libx264)

AVIへの変換 copy

ffmpeg -i input.wmv -c:v:1 copy output.avi

Input #0, asf, from 'input.wmv':
  Metadata:
    WMFSDKVersion   : 12.0.7601.17514
    WMFSDKNeeded    : 0.0.0.0000
    IsVBR           : 0
    encoder         : Lavf54.22.100
  Duration: 01:14:23.06, start: 0.000000, bitrate: 324 kb/s
    Stream #0:0: Video: msmpeg4 (MP43 / 0x3334504D), yuv420p, 1280x720, 15 tbr,
1k tbn, 1k tbc
Output #0, avi, to 'output.avi':
  Metadata:
    WMFSDKVersion   : 12.0.7601.17514
    WMFSDKNeeded    : 0.0.0.0000
    IsVBR           : 0
    ISFT            : Lavf54.22.100
    Stream #0:0: Video: mpeg4 (FMP4 / 0x34504D46), yuv420p, 1280x720, q=2-31, 20
0 kb/s, 15 tbn, 15 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (msmpeg4 -> mpeg4)

渡す必要のある追加のパラメーターはありますか?


もちろん、ビットストリームをコピーするだけの場合は高速です—ではcopy、何も再エンコードしません。CPUなどのハードウェアはありますか?あなたのOSは何ですか?それはFFmpegのどのバージョンですか?
slhck 2012

@slhck:コンピュータは非常に高速ではないE5400 2.7GHzですが、mp4の場合は低速ですが、aviの場合は高速なのはなぜですか?
ジョルジ

あなたの質問にはAVI出力がありません。完全な出力で更新できますか?
slhck 2012

@slhck:avi出力を追加
Giorgi

回答:


17

ストリームのコピー

を呼び出すと-c:v:1 copy、FFmpegは既存のビデオビットストリームを取得し、ストリームコピーします。ビデオビットストリームは、WMV、AVI、MP4などの外部コンテナにカプセル化されるだけです。実際のビデオビットストリームはmsmpeg4、このままです。

私が話していることについて詳しく知りたい場合は、こちらをご覧ください:コーデック(DivXなど)とは何ですか。また、ファイル形式(MPGなど)とどう違うのですか?

ビットストリームをコピーするとき、FFmpegは実際のビデオを実際にデコードおよび再エンコードする必要はありません。ビデオのビットストリームを新しいコンテナ形式にマージする必要があるだけです。これは、多くの場合かなり単純な操作であり、そのため時間がかかりません。

エンコーディング

それとは対照的に、呼び出した場合-vcodec libx264(またはは非推奨である-c:v libx264ため使用する構文vcodec)、FFmpegはからビデオビットストリームをmsmpeg4未加工の形式にデコードしx264、H.264エンコーダーにパイプ処理します。

x264は高速ですが、動画のエンコードには時間がかかります。特に720pコンテンツの場合はそうです。また、特に入力がすでに1時間を超える場合は、1時間以上かかる場合があります。また、CPUが最も高速でない場合もあります。これが、XviDなどの古いMPEG-4ビジュアルエンコーダーがまだ普及しており、非常に人気がある主な理由です。H.264コーデックよりもエンコードに時間がかかりません。品質とファイルサイズの面で最高のパフォーマンスが得られるとは限りませんが、高速です。

つまり、プリセットを強制することでx264エンコーディングを高速化できます。プリセットはエンコーダの最適化設定であり、範囲は、超高速、超高速、超高速、高速、高速、中速、低速、低速、超低速です。コマンドは次のようになります。

ffmpeg -i input.wmv -c:v libx264 -preset fast out.mp4

プリセットがない場合よりも速く実行されます。唯一の欠点は、同じ圧縮率では、たとえばと比べて品質が良くないこと-preset veryslowです。

それとは別に、高速なCPUに投資し、x264をサポートするFFmpegの最新ビルドを実行していることを確認する以外にできることは多くありません。

詳細については、FFmpeg Wiki:H.264 Encoding Guideを参照してください。


答えてくれてありがとう。私が明確であったかどうかはわかりませんが、コピーを使用すると、それでも非常に遅いです。私はあなたのコマンドを試しました、そしてそれは5分後4秒しか処理しませんでした。私のビデオの長さは約75分で、aviへの変換には15分しかかかりませんが、mp4には数時間かかります。
ジョルジ

libx264とh264のどちらがエンコードに最適ですか?
Yohanes AI 2018

@NPE libx264エンコーダとして´h264`を指定した場合、デフォルトではffmpegが使用するため、違いはありません。
slhck

1
@PeterCordesに変更しましたfast。興味深い統計(VMAFがここで信頼できる場合):streaminglearningcenter.com/blogs/…–
slhck

1
@PeterCordes AQなど、VMAFが適切に処理できないいくつかのRC最適化があります:github.com/Netflix/vmaf/issues/21。私は高品質の1080pとcrappy UHDの部分に同意します。ブログの作成者は、彼のテストを改善する方法についての提案を非常に受け入れています。私はすでにx265の設定ミスについて少し前にコメントしました。
slhck

3

私はWMV-> MP4変換で(無限時間)遊んでいたので、超高速な方法を見つけました。しかし、それには価格があります:ストレージの価格です。WMVをロスレスに変換してから、ロスレスからMP4に変換すると、すぐに完全な変換が行われます。ただし、ロスレスバージョンを保存するには、100倍のHDD容量が必要です。

そのため、WMV-> MP4変換の非常に遅いバージョンまたはHDD集中型バージョンから選択でき、他に選択肢がないことがわかります。

WMVをロスレスAVIに変換する:ffmpeg.exe -i screen.wmv -vcodec ffv1 screen.avi次に、ロスレスAVIをMP4(またはWebM、問題ではありません)に変換しますffmpeg.exe -i screen.avi screen.mp4

超早い!

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