使用ffmpeg将webm转换为mp4

时间:2013-08-08 10:14:01

标签: ffmpeg webm libx264 vp8

当我尝试将webm文件转换为mp4时,输出非常不稳定,看起来ffmpeg已经删除了很多帧

我使用以下命令转换

ffmpeg -i movie.webm movie.mp4
ffmpeg -i movie.webm -vcodec libx264 movie.mp4
ffmpeg -i movie.webm -vcodec libx264 -qscale 0 movie.mp4

他们都有同样的问题。当我使用ffprobe时,它似乎或多或少地显示帧。

更新

 built on Jun 14 2013 14:31:50 with gcc 4.7 (Ubuntu/Linaro 4.7.2-2ubuntu1)
  configuration: --prefix=/home/user2/ffmpeg_build --extra-cflags=-I/home/user2/ffmpeg_build/include --extra-ldflags=-L/home/pavan4/ffmpeg_build/lib --bindir=/home/pavan4/bin --extra-libs=-ldl --enable-gpl --enable-libass --enable-libfdk-aac --enable-libmp3lame --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-nonfree --enable-x11grab
  libavutil      52. 35.101 / 52. 35.101
  libavcodec     55. 16.100 / 55. 16.100
  libavformat    55.  8.102 / 55.  8.102
  libavdevice    55.  2.100 / 55.  2.100
  libavfilter     3. 77.101 /  3. 77.101
  libswscale      2.  3.100 /  2.  3.100
  libswresample   0. 17.102 /  0. 17.102
  libpostproc    52.  3.100 / 52.  3.100
Hyper fast Audio and Video encoder
usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...

Use -h to get full help or, even better, run 'man ffmpeg'

Input #0, matroska,webm, from '1.webm':
  Duration: 00:00:10.64, start: 0.000000, bitrate: 5024 kb/s
    Stream #0:0(eng): Video: vp8, yuv420p, 1280x720, SAR 1:1 DAR 16:9, 1k fps, 1k tbr, 1k tbn, 1k tbc (default)
[libx264 @ 0x1d966a0] using SAR=1/1
[libx264 @ 0x1d966a0] MB rate (3600000) > level limit (2073600)
[libx264 @ 0x1d966a0] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2
[libx264 @ 0x1d966a0] profile High, level 5.2
[libx264 @ 0x1d966a0] 264 - core 133 r2 a3ac64b - H.264/MPEG-4 AVC codec - Copyleft 2003-2013 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=12 lookahead_threads=2 sliced_threads=0 nr=0 decimate=1 interlaced=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=25 scenecut=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 '1_conv4.mp4':
  Metadata:
    encoder         : Lavf55.8.102
    Stream #0:0(eng): Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], q=-1--1, 16k tbn, 1k tbc (default)
Stream mapping:
Stream #0:0 -> #0:0 (vp8 -> libx264)
Press [q] to stop, [?] for help
frame=  168 fps=0.0 q=33.0 size=      62kB time=00:00:00.11 bitrate=4606.0kbits/frame=  293 fps=230 q=33.0 size=     138kB time=00:00:00.23 bitrate=4809.7kbits/

video:5620kB audio:0kB subtitle:0 global headers:0kB muxing overhead 2.212461%
[libx264 @ 0x1d966a0] frame I:46    Avg QP:18.50  size: 39849
[libx264 @ 0x1d966a0] frame P:2940  Avg QP:18.27  size:  1222
[libx264 @ 0x1d966a0] frame B:7651  Avg QP:17.68  size:    43
[libx264 @ 0x1d966a0] consecutive B-frames:  4.0%  0.2%  0.3% 95.5%
[libx264 @ 0x1d966a0] mb I  I16..4: 19.9% 63.2% 16.9%
[libx264 @ 0x1d966a0] mb P  I16..4:  0.2%  0.5%  0.1%  P16..4:  3.9%  1.1%  0.6%  0.0%  0.0%    skip:93.6%
[libx264 @ 0x1d966a0] mb B  I16..4:  0.0%  0.0%  0.0%  B16..8:  0.2%  0.0%  0.0%  direct: 0.0%  skip:99.8%  L0:25.1% L1:74.9% BI: 0.0%
[libx264 @ 0x1d966a0] 8x8 transform intra:63.6% inter:75.9%
[libx264 @ 0x1d966a0] coded y,uvDC,uvAC intra: 61.5% 53.4% 24.4% inter: 0.5% 0.5% 0.0%
[libx264 @ 0x1d966a0] i16 v,h,dc,p: 52% 19% 19% 11%
[libx264 @ 0x1d966a0] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 32% 17% 13%  4%  6%  9%  5%  8%  6%
[libx264 @ 0x1d966a0] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 30% 18% 14%  5%  8% 10%  6%  6%  3%
[libx264 @ 0x1d966a0] i8c dc,h,v,p: 55% 17% 24%  4%
[libx264 @ 0x1d966a0] Weighted P-Frames: Y:0.0% UV:0.0%
[libx264 @ 0x1d966a0] ref P L0: 82.5% 13.2%  4.0%  0.3%
[libx264 @ 0x1d966a0] ref B L0: 60.2% 39.2%  0.6%
[libx264 @ 0x1d966a0] ref B L1: 98.5%  1.5%
[libx264 @ 0x1d966a0] kb/s:4327.77

5 个答案:

答案 0 :(得分:56)

当您的输入文件报告来自tbs和tbr值的奇怪帧速率值1k fps时(看here for their definition

编码器生成不同的结果16k tbn, 1k tbc (default)

所以致电:

ffmpeg -fflags +genpts -i 1.webm -r 24 1.mp4

您可以将ffmpeg配置为为每个帧生成新的pts(a / k.a Presentation TimeStamp),并将目标帧速率设置为24。

因此您的输出mp4文件信息(ffmpeg -i ....)从

更改
Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 4327 kb/s, 1000.09 fps, 1k tbr, 16k tbn, 2k tbc

Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 1670 kb/s, 24 fps, 24 tbr, 12288 tbn, 48 tbc

答案 1 :(得分:9)

将WebM重新混合到MP4

如果您想stream copy(重新混合)并避免重新编码:

ffmpeg -i input.webm -c copy output.mp4

这会将VP9 / VP8视频和Opus / Vorbis音频从WebM复制到MP4。

如果您的输入内容包含Opus音频

但是,如果您的输入包含Opus音频,则需要添加输出选项-strict experimental(或别名-strict -2):

ffmpeg -i input.webm -c copy -strict experimental output.mp4

否则,您将得到一个错误:

opus in MP4 support is experimental, add '-strict -2' if you want to use it.
Could not write header for output file #0 (incorrect codec parameters ?): Experimental feature
  • 这种情况将来可能会改变,因此您始终可以先尝试使用-strict experimental / -strict -2

  • 如果您的输入内容不包含Opus音频,则包含-strict experimental / -strict -2不会受到损害。

  • 如果省略-strict experimental并重新编码为MP4,则不需要-strict -2 / -c copy

答案 2 :(得分:4)

我能够通过ffmpeg -i video.webm -strict experimental video.mp4进行转化。

答案 3 :(得分:4)

我在这里总结了使用建议的许多命令行选项从 webm 转换为 mp4 的结果。

我们在这里假设,如果您问这个问题,那么您将不得不使用 webm,因为 Android Studio 中的 Android 设备模拟器为您生成了它,而您使用的是 Mac,因此您会非常喜欢用iMovie来编辑视频。

1 ffmpeg -i vid.webm vid-1.mp4 Ref 需要 17.8 秒。输出文件为 1.5 MB。

2 ffmpeg -i vid.webm -crf 1 -c:v libx264 vid-2.mp4 需要 18 秒。输出文件为 7.6 MB。

3 ffmpeg -i vid.webm -crf 0 -c:v libx264 vid-3.mp4 Ref 需要 21 秒。输出文件为 11.9 MB。

4 ffmpeg -fflags +genpts -i vid.webm -r 24 vid-4.mp4 Ref 需要 0.16 秒。输出文件为 1.5 MB。

5 ffmpeg -i vid.webm -c copy vid-5.mp4 Ref 需要 2.8 秒。输出文件为 64.6 MB。

6 ffmpeg -i vid.webm -strict experimental vid-6.mp4 Ref 需要 18 秒。输出文件为 1.5 MB。

7 ffmpeg -i vid.webm -c copy -strict experimental vid-7.mp4 Ref 需要 0.16 秒。输出文件为 64.6 MB。

8 ffmpeg -i vid.webm -c:v copy -strict experimental vid-8.mp4 还有Ref 需要 0.69 秒。输出文件为 64.5 MB。

只能将数字 1、2、3、4 和 6 导入到 iMovie (10.2)。

使用的 ffmpeg 版本是 4.3。

这是第一步。我省略了更复杂的质量比较。

也许等待您的最糟糕的陷阱是 iMovie 真的想制作 1920x1080 的电影,因此您很可能会在旁边看到两个大黑条。如果您正在以纵向模式编辑应用程序的演示,则会浪费大量空间。如果可以,理想情况下您会希望以该分辨率制作视频。

最直接的续集问题是:假设您真的不需要大量推送的 Final Cut Pro(因为您是程序员,而不是视频编辑器),FCP 会允许您设置自己的分辨率吗?< /p>

答案 4 :(得分:0)

经过几个小时的测试,我能够将matroska / webm(输入#0,matroska,webm,从“ testit1.webm”)输入转换为mp4输出(输出#0,mp4,至“ testit1.mp4”) ')。该视频是使用mediarecorder以chrome录制的。

ffmpeg -i testit1.webm -c copy -strict experimental testit1.mp4

但是,通过这样做,我们保留了较小的webm视频。但是我们没有任何音频。为了使音频正常工作,我们使用了:

ffmpeg -i testit1.webm -c:v copy -strict experimental testit1.mp4

希望这对您有帮助。