web-dev-qa-db-ja.com

WMVからMP4への変換が非常に遅いのはなぜですか?

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)

copyによるMP4への変換

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)

copyを使用したAVIへの変換

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)

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

12
Giorgi

ストリームのコピー

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

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

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

エンコーディング

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

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

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

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

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

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

詳細は FFmpeg Wiki:H.264エンコーディングガイド を参照してください。

17
slhck

私は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

超早い!

3
Marcell Foti