webm to mp4 conversion using ffmpeg

When I try to convert a webm file to mp4 the output is very very choppy and it appears as if many frames have been dropped by ffmpeg

I used the following commands to convert

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

All of them have the same problem. When I use ffprobe it seems to show the frames more or less properly.

UPDATE:

 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
155452 次浏览

当您的输入文件报告一个奇怪的帧速率值 1k fps来自 tbs 和 tbr 值(看看 这里是他们的定义)

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

所以通过打电话:

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

配置 ffmpeg 为每个帧生成新的 pt (也称为 PresentationTimeStamp) ,并将目标帧速率设置为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

I was able to convert byffmpeg -i video.webm -strict experimental video.mp4.

重新组合 WebM 到 MP4

如果您想要 流程复制(re-mux)并避免重新编码:

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

这将复制 VP9/VP8视频和 Opus/Vorbis 音频从 WebM 到 MP4。这就像一个“复制和粘贴”。没有重新编码发生,所以没有质量损失和过程是非常快的。

(注意,如果只复制视频而不复制音频,那么将使用 -c:v copy而不是 -c copy。重点是,-c部分在这两种情况下的意思是相同的。)

如果你得到错误: “ opus 在 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

那么,要么:

  • 使用较新的 ffmpeg,因为 MP4中的 Opus 在较新的 ffmpeg版本中不再是实验性的。
  • 或者添加 -strict experimental(或别名 -strict -2) ,如果你被过时的 ffmpeg卡住了。

经过几个小时的测试,我能够将 matroska/webm (Input # 0,matroska,webm,from‘ testit1.webm’)输入转换为 mp4输出(Output # 0,mp4,to‘ testit1.mp4’)。这段视频是用铬合金录像机录制的。

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

然而,通过这样做,我们保持了 webm 视频的小尺寸。但是我们没有任何音频。为了让我们使用的音频工作:

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

希望这对你们有所帮助。

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

We assume here that if you're asking this question, then you're forced to use webm because the Android device emulator within Android Studio generated it for you, and you're on a Mac so you'd really like to use iMovie to edit the video.

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 裁判 Takes 21 sec. Output file is 11.9 MB.

4 ffmpeg -fflags +genpts -i vid.webm -r 24 vid-4.mp4 裁判 耗时0.16秒,输出文件为1.5 MB。

5 ffmpeg -i vid.webm -c copy vid-5.mp4 裁判 耗时2.8秒,输出文件为64.6 MB。

6 ffmpeg -i vid.webm -strict experimental vid-6.mp4 裁判 耗时18秒,输出文件为1.5 MB。

7 ffmpeg -i vid.webm -c copy -strict experimental vid-7.mp4 裁判 耗时0.16秒,输出文件为64.6 MB。

8 ffmpeg -i vid.webm -c:v copy -strict experimental vid-8.mp4 Also 裁判 耗时0.69秒,输出文件为64.5 MB。

只有数字1、2、3、4和6可以导入到 iMovie(10.2)。

使用的 ffmpeg版本是4.3。

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

也许等待你的最糟糕的陷阱是 iMovie真的想要制作一部1920x1080的电影,所以你可能会得到两个大的黑条在旁边。如果你在纵向模式下编辑应用程序的演示,你将会浪费大量的空间。如果可以的话,理想情况下,你会希望制作一个这种分辨率的视频。

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

您可以将文件路径放在一个文本文件中,然后执行以下循环:

while read line; do ffmpeg -i "$line" -c:v libx264 -y "${line%.webm}.mp4" ;done < convert_us.txt

注意-c: v 部分是可选的,并确保视频代码为 h.264。