FFmpeg - WhatsApp:视频格式不支持

55
我有两个视频(.mp4)文件,其中一个可以上传到WhatsApp,而另一个则不行。
使用FFmpeg我检查了它们的属性:
a) 可以上传的视频属性:
  Duration: 00:00:56.45, start: 0.148000, bitrate: 1404 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1080x1080, 1359 kb/s, 23.98 fps, 23.98 tbr, 90k tbn, 47.95 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(eng): Audio: aac (HE-AACv2) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 47 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
At least one output file must be specified

b) 视频无法上传到 WhatsApp(因为其格式不受支持)

  Duration: 00:00:56.10, start: 0.000000, bitrate: 543 kb/s
    Stream #0:0: Video: h264 (High) (H264 / 0x34363248), yuv420p, 1080x1080 [SAR 1:1 DAR 1:1], 464 kb/s, 23.98 fps, 23.98 tbr, 23.98 tbn, 47.95 tbc
    Stream #0:1: Audio: aac (LC) ([255][0][0][0] / 0x00FF), 48000 Hz, stereo, fltp, 56 kb/s

我注意到的视频差异:

(avc1 / 0x31637661)(H264 / 0x34363248)

1359 kb/s464 kb/s

90k tbn23.98 tbn

可能是什么原因呢?

同时,第二个视频在安卓设备上无法播放。

视频链接:https://drive.google.com/open?id=0B4UM6vTHw4pyMExQQ1lxZGp0N2c


6个回答

119

提高兼容性的几种选项:

ffmpeg -i broken.mp4 -c:v libx264 -profile:v baseline -level 3.0 -pix_fmt yuv420p working.mp4

通过使用-profile:v baseline -level 3.0,您可以使文件与大多数较旧的播放器(包括WhatsApp ;))更兼容。但这会禁用一些高级功能。

-pix_fmt yuv420p是必需的,以便编译为基线(带有4:2:0色度抽样的YUV平面颜色空间)。

此外,您还可以调整其他选项,如比特率、帧率、音频等。

来源:H.264文档


1
在我的情况下,问题出在 pix_fmt 上,它不是 yuv420p。 - Aurangzeb
2
真的,这很好用,但是你怎么可能知道这个庞大的命令行? - Caio Mar
2
@CaioMar 我真的不记得我是怎么得到它的。我想是通过在FFmpeg H264文档和“尝试和失败”中进行研究。这一切都与“兼容性”有关...而H264编码也有相应的选项。 - Mario Mey
1
@JamieHutber 我仍然使用这个命令。不仅如此,我认为WhatsApp Web比以前更灵活,可以接受更多格式。你的ffmpeg版本是多少? - Mario Mey
1
你能相信吗... WhatsApp 刚刚发布了一个更新,修复了这个问题!!! 在过去的10分钟内 :D 现在文件可以正常工作了。 - Jamie Hutber
显示剩余4条评论

10
我尝试了所有之前的命令,但是都出现了一些错误。使用这个命令我成功地对视频进行了编码,以下是解释以及我将其设置为何种方式以获得更好的兼容性:
ffmpeg -i input.mp4 \
 -c:v libx264 -pix_fmt yuv420p \
 -profile:v baseline -level 3.0 \
 -vf "pad=ceil(iw/2)*2:ceil(ih/2)*2" -vb 1024k \
 -acodec aac -ar 44100 -ac 2\
 -minrate 1024k -maxrate 1024k -bufsize 1024k \
 -movflags +faststart \
 output.mp4
  • 如果您的输入包含AAC音频,您可以通过将-acodec aac -ar 44100 -ac 2更改为-acodec copy来保留音频质量,并进行流复制而不是重新编码。
选项 说明
-vcodec libx264 选择视频编码器libx264
-pix_fmt yuv420p 确保兼容性的YUV 4:2:0色度子采样
-profile:v baseline 将编码配置文件设置为baseline。主要用于需要额外数据损失鲁棒性的低成本应用程序
-level 3.0 将操作点级别设置为3.0,这是与WhatsApp兼容所必需的
-vf "pad=ceil(iw/2)*2:ceil(ih/2)*2" 如果出现不可被2整除的错误,请参见
-acodec aac 选择音频编码器aac
-minrate 1024k 将最小比特率容差设置为1024k(以位/秒为单位)。否则几乎没有用处
-maxrate 1024k 将最大比特率容差设置为1024k(以位/秒为单位)。需要设置缓冲区大小
-bufsize 1024k 将速率控制缓冲区大小设置为1024k(以位为单位)
-movflags +faststart 启用快速启动以进行流式传输

关于快速启动的说明

通常,MP4文件的所有元数据包都存储在文件末尾,以名为原子的数据单元命名。 mdat 原子位于 moov 原子之前。如果使用 -movflags faststart 添加文件,则 moov 原子将移动到 MP4 文件的开头。通过使用此选项,moov 原子位于 mdat 原子之前。这使得视频回放可以在文件完全下载之前开始。


刚试了一下,可以用。之前试了下面的一个版本,现在似乎已经不能用了。2022年4月。 - Javier Villa
+faststart 对 Whatsapp 有益吗? 此外,.mp4 可以使用 -movflags 吗?而不仅仅是 .mov? - Antti Rytsölä
没有一个从“WhatsApp Web”上传成功。不得不将文件移动到手机上,然后从应用程序上传,现在可以使用了。 - Madacol

8

https://www.reddit.com/r/ffmpeg/comments/564kyc/ffmpeg_whatsapp_video_format_not_supported/?st=ivjxdi0v&sh=848ce7eb复制

这篇文章讨论了使用FFmpeg转换视频以适应WhatsApp的格式要求。用户遇到了一个问题,即他们尝试将视频转换为MP4格式并发送到WhatsApp,但WhatsApp似乎无法支持该格式。在这篇文章中,有人提出了一种解决方法:通过重新编码视频来转换成H.264+AAC视频流。这可以通过运行以下命令来实现: ffmpeg -i input.mp4 -c:v libx264 -c:a aac -b:a 128k output.mp4 这将生成一个符合WhatsApp规格的视频,并且可以成功发送到WhatsApp。
ffmpeg -i brokenvideo.mp4 -c:v libx264 -c:a aac fixedvideo.mp4

还需要应用此修复方法:FFMPEG(libx264)"高度不可被2整除"


2
此命令将重新编码视频和音频。我打赌这只是视频标签的问题。尝试 ffmpeg -i broken.mp4 -c copy -vtag avc1 fixed.mp4 - Gyan

7

这在2020年对我有用

ffmpeg -i broken.mp4 -c:v libx264 -profile:v high -level 3.0 -pix_fmt yuv420p -brand mp42 fixed.mp4

同样的(而其他的没有) - Idiot Tom
我在ffmpeg或H264编码中找不到-brand mp42选项。也许这是来自MP4Box (这里)。如果你想用ffmpeg设置fourcc为mp42,那么你应该使用-tag:v mp42 - Mario Mey
1
它仍在工作。 - Gediz GÜRSU
似乎在2022年对我不起作用。 - Jamie Hutber

2

2023年1月22日,我使用了最受欢迎的答案格式,它适用于视频,但在iPhone上无法播放音频。以下是对我有效的解决方案:

ffmpeg -i broken.mp4 -c:v libx264 -profile:v baseline -level 3.0 -pix_fmt yuv420p -ac 2 working.mp4

我不得不添加-ac 2,因为我的音频格式在iOS中没有被视为立体声。


0

复制@teocci's answer到PowerShell:

ffmpeg -i 'input.mp4' `
-c:v libx264 -pix_fmt yuv420p `
-vf "pad=ceil(iw/2)*2:ceil(ih/2)*2" -vb 1024k `
-acodec aac -ar 44100 -ac 2 `
-minrate 1024k -maxrate 1024k -bufsize 1024k `
-movflags +faststart `
output.mp4

如果您的视频已经有AAC:
ffmpeg -i 'input.mp4' `
-c:v libx264 -pix_fmt yuv420p `
-vf "pad=ceil(iw/2)*2:ceil(ih/2)*2" -vb 1024k `
-acodec copy `
-minrate 1024k -maxrate 1024k -bufsize 1024k `
-movflags +faststart `
output.mp4

请查看原始答案以获取更多详细信息。由于不允许评论,因此我会发布一个答案。


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