为什么将 WMV 转换为 MP4 这么慢?

为什么将 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)

使用以下方式转换为 MP4copy

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)

转换为 AVIcopy

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)

我是否需要传递一些额外的参数?

答案1

流复制

当你调用时-c:v:1 copy,FFmpeg 将获取现有的视频比特流并流复制它。视频比特流只是封装在外部容器中,例如 WMV、AVI 或 MP4 – 您的实际视频比特流就是msmpeg4这样并且将保持这种状态。

如果您想进一步了解我所说的内容,请参见此处:什么是编解码器(例如 DivX?),它与文件格式(例如 MPG)有何不同?

在复制比特流时,FFmpeg 不需要真正解码并重新编码实际视频。它只需要将视频比特流合并到新的容器格式中,这通常是一个相当简单的操作,因此不需要很长时间。

编码

与此相反,如果您调用-vcodec libx264(或-c:v libx264,您应该使用的语法,因为vcodec已被弃用),FFmpeg 将被强制将视频比特流解码为msmpeg4原始格式,然后将其输入到x264H.264 编码器。

x264 速度很快,但编码视频仍然需要时间——尤其是 720p 内容。而且可能需要一个多小时,特别是如果您的输入已经超过一个小时。此外,您的 CPU 可能不是最快的。这是较旧的 MPEG-4 Visual 编码器(如 XviD)仍然存在且非常流行的主要原因:它们的编码时间比 H.264 编解码器短。它们可能无法为您提供质量与文件大小方面的最佳性能,但它们速度很快。

综上所述:您可以通过强制预设来加快 x264 编码速度。预设是编码器优化设置,范围包括:超快、超快、非常快、更快、快、中、慢、慢、非常慢。您的命令可能如下所示:

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

它应该比没有预设时运行得更快。唯一的缺点是,与例如相比,它在相同压缩率下无法实现良好的质量-preset veryslow

除此之外,你能做的不多,除了投资一个快速的 CPU,并确保你运行的是支持 x264 的最新版本的 FFmpeg。

有关详细信息,请参阅FFmpeg Wiki:H.264 编码指南

答案2

当我(无休止地)玩 WMV->MP4 转换时,我发现了一种超快的方法。但它有一个代价:存储代价。如果你将 WMV 转换为无损,然后从无损转换为 MP4,它会立即完成完全转换。但你需要 100 倍的硬盘空间来存储无损版本,这很麻烦。

因此,事实证明,您可以选择非常慢或非常占用 HDD 的 WMV->MP4 转换版本,并且您别无选择。

将 WMV 转换为无损 AVI:ffmpeg.exe -i screen.wmv -vcodec ffv1 screen.avi 然后将无损 AVI 转换为 MP4(或 WebM,无所谓)ffmpeg.exe -i screen.avi screen.mp4

超级快!

相关内容