使用FFMPEG将MP4转换为最大移动设备支持的MP4格式

23
我想使用ffmpegmp4转换为“低大小”的mp4...。我需要一个h263视频和aac音频的mp4文件(或其他一些低成本手机支持的设置)。我最关心的是视频能够在大多数设备上播放。有哪些可能的ffmpeg命令可以完成这个任务?先行致谢。
3个回答

50

有多种方式可以对mp4视频进行编码,而为移动设备编码则更加复杂。我不确定您所说的“低成本移动”是指设备低成本还是播放该视频所需的带宽低成本?

无论哪种方式,这里有一篇文章可以让您开始:H.264 WEB VIDEO ENCODING TUTORIAL WITH FFMPEG

示例

以下是文章中的一些ffmpeg示例...

标准的网络视频(480p,500kbit/s):

ffmpeg -i input_file.avi -vcodec libx264 -vprofile high -preset slow -b:v 500k -maxrate 500k -bufsize 1000k -vf scale=-1:480 -threads 0 -acodec libvo_aacenc -b:a 128k output_file.mp4

旧款移动电话的360p视频(基准配置下,360p,250kbit/s):

ffmpeg -i inputfile.avi -vcodec libx264 -vprofile baseline -preset slow -b:v 250k -maxrate 250k -bufsize 500k -vf scale=-1:360 -threads 0 -acodec libvo_aacenc -ab 96k output.mp4

iPad和平板电脑的480p视频(主配置下,480p,400kbit/s):

ffmpeg -i inputfile.avi -vcodec libx264 -vprofile main -preset slow -b:v 400k -maxrate 400k -bufsize 800k -vf scale=-1:480 -threads 0 -acodec libvo_aacenc -ab 128k output.mp4

高品质的SD视频用于存档/存储(PAL以1Mbps在高级配置文件下):

ffmpeg -i inputfile.avi -vcodec libx264 -vprofile high -preset slower -b:v 1000k -vf scale=-1:576 -threads 0 -acodec libvo_aacenc -ab 196k output.mp4

比特率、缩放和配置文件 ...

从上述示例中,您需要注意的一些关键要素包括...

-b:v 500k

-b:a 128k

这些是视频 v 和音频 a 的比特率,数值越小质量就越低,但也可能在低端设备上播放得更好。

scale=-1:480

这将把视频缩小到更小的尺寸,有关更多信息,请参见帖子。

-vprofile baseline

这个看似奇怪的 baseline(或其他适当的配置文件参数),可以在编码用于某些低成本设备(例如Android)时变得重要...

基准配置文件(BP)

主要用于需要额外数据丢失鲁棒性的低成本应用程序,这个配置文件在一些视频会议和移动应用程序中使用。这个配置文件包括所有在受限基线配置文件中支持的特性,再加上三个额外的特性,可以用于提高鲁棒性(或用于其他目的,如低延迟多点视频流合成)。由于在2009年定义了受限基线配置文件,因此该配置文件的重要性有所降低。所有受限基线配置文件位流也被认为是基准配置文件位流,因为这两个配置文件共享相同的配置文件标识符代码值。


这个转换过程中,我的输入和输出文件格式相同。 - Notepad
我正在尝试使用你的360p命令将AVI转换为MP4,但是"-acodec libvo_aacenc -ab 128k"无法工作。如果我用"-acodec copy"替换它,它就可以工作了。它的错误是"Error while opening encoder for output stream #0:0 - maybe incorrect parameters such as bit_rate, rate, width or height"。我应该为音频设置更多参数吗?如果是,那些参数是什么? - Uchiha_Sasuke
2
@user1202498 -acodec copy 实际上不会对音频进行编码,而是将旧文件中的音频流复制到新文件中。如果您支持 libvo_aacenc(您有吗?),则无需设置任何特殊内容。您还可以尝试使用 -codec:a aac -strict experimental 来使用ffmpeg的本地aac编码。 - Justin Jenkins
非常感谢,所有现有的解决方案都具有过时的参数。 - imal hasaranga perera
1
关于 -movflags +faststart 输出选项,它可以将一些信息移动到文件开头,使视频在完全下载之前就可以开始播放。参考链接:https://trac.ffmpeg.org/wiki/Encode/H.264#faststartforwebvideo。 - abernier
宽度不可被2整除(853x480)。 - ar2015

0
 ffmpeg.exe -i "input.mp4" -vcodec mpeg4 -preset slower -b:v 1000k -vf "scale=640:480,setsar=1,fps=30,pad=640:480:0:0" -acodec aac -ac 2 -ar 22050 -ab 128k "output (480p).mp4"

4
虽然这段代码可能解决了问题,但是包括说明这个解决方案的如何以及为什么能够解决问题将有助于提高你帖子的质量,并且可能会带来更多的赞。请记住,你回答问题是为了未来的读者,而不仅仅是现在提问的人。请编辑你的答案添加解释并指出适用的限制和假设。 - Yunnosch
1
@Yunnosch的观点总是很重要的,但当社区已经验证了一个被接受的答案时,它尤其重要。在什么情况下可能更喜欢您的方法?您是否利用了新的功能? - Jeremy Caney

-1

我找到了答案,无论如何还是谢谢你的帮助。

ffmpeg -i $input_file -s $size $output_file

$size:320X400或任何宽度X高度


2
这并没有回答你的问题。Justin Jenkins的回答更加完整和有见地。链接的博客文章也提供了更多细节来回答这个编码移动设备视频的复杂问题。 - Arko
这只是进行旋转而没有任何修改,正是我想要的,我不需要文档链接。 - Notepad
@Susheel:那个命令行根本没有旋转,它只是进行了调整大小 - 没有设置编解码器或比特率(这正是问题所问的)。 - Mark K Cowan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接