为什么将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?您的操作系统是什么,什么是FFmpeg版本?
slhck

@slhck:计算机不是非常快的E5400 2.7GHz,但是为什么mp4速度慢而avi速度快?
Giorgi

我在您的问题中没有看到任何AVI输出。您能否用完整的输出更新它?
slhck

@slhck:加入AVI输出
的Giorgi

Answers:


17

流复制

调用时-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可能不是最快的。这是诸如XviD之类的老式MPEG-4 Visual编码器仍然存在并且非常流行的主要原因:与H.264编解码器相比,它们花费的时间更少。在质量与文件大小方面,它们可能无法为您提供最佳性能,但它们速度很快。

这就是说:您可以通过强制预设来加快x264编码。预设是编码器优化设置,范围从:超快,超快,非常快,更快,快,中,慢,慢,非常慢。您的命令如下所示:

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

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

除此之外,除了投资快速的CPU并确保运行的是x264支持的FFmpeg的最新版本外,您无能为力。

有关更多信息,请参见FFmpeg Wiki:H.264编码指南


感谢您的回答。我不确定自己是否很清楚,但是如果我使用复印,那还是很慢的。我尝试了您的命令,它在5分钟后仅处理了4秒钟。我的视频长约75分钟,转换为avi只需15分钟,而mp4则需要几个小时。
Giorgi

那么哪一种最适合编码,libx264或h264?
Yohanes AI

@NPE libx264当您指定“ h264”作为编码器时,默认情况下ffmpeg会使用它们。
slhck '18

1
@PeterCordes我将其更改为fast。一些有趣的统计信息(如果可以在这里信任VMAF):streaminglearningcenter.com/blogs/…–
slhck

1
@PeterCordes有一些VMAF无法很好处理的RC优化,例如AQ:github.com/Netflix/vmaf/issues/21。我同意高质量的1080p与糟糕的UHD部分。该博客的作者非常乐意接受有关如何改进其测试的建议;刚才我已经评论了x265的一些错误配置。
slhck

3

当我玩WMV-> MP4转换(无休止)时,我发现了一种超快的方法。但是它有一个价格:存储价格。如果将WMV转换为无损,然后从无损转换为MP4,它将立即进行完整转换。但是您需要100倍的硬盘空间来存储无损版本,这很痛苦。

因此,事实证明您可以从WMV-> MP4转换非常慢或HDD密集型版本中进行选择,而您别无选择。

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

超级快!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.