ffmpeg mp4 视频无法在浏览器的 html5 视频播放器上播放(损坏的格式)

ffmpeg mp4 video is not playing on html5 video player on browser (corrupt format)

我正在执行以下命令在视频上插入水印并输出为 mp4 格式,但 html5 视频播放器无法在浏览器上播放该格式。

$video_url = '../../../uploads/myvideo.mp4';
$watermarked = '../../../uploads/watermarked_video.mp4';
exec("ffmpeg -i $video_url -vf \"movie='sos.png', crop=iw:ih:0:0:dar [img]; [in] [img] overlay=(W-w)/2:(H-h)/2 [out]\" -vcodec mpeg4 -f avi $watermarked");  //creating water marked video

如果我将它下载到我的本地机器上,那么它可以在播放器上完美播放。

有语法问题吗?

输出格式不太正确。这里有两个因素需要考虑:

  1. "container format" 或 "file format",这是整个文件的排列方式(例如 AVI、MOV/QuickTime、WebM、Ogg)
  2. "codec",这是用于压缩和解压缩容器内的视频和音频数据的算法。大多数文件将有两种编解码器:一种用于音频(例如 AAC、Vorbis、MP3、Opus),一种用于视频(例如 H.264、VP8、Theora)。

ffmpeg 支持读写许多不同的格式和编解码器,VLC 播放器也是如此。 QuickTime 也有,但没有那么多。然而,浏览器更加挑剔。您以 "AVI" 容器格式保存文件,浏览器不支持这种格式。您可能应该使用 libx264 作为编解码器,它将输出 H.264 视频,并且比 mpeg4 将输出 MPEG-4 Part 2 视频使用更广泛和更可靠。

试试这个:

$video_url = '../../../uploads/myvideo.mp4';
$watermarked = '../../../uploads/watermarked_video.mp4';
exec("ffmpeg -i $video_url -i sos.png -filter_complex \"[1:v]crop=iw:ih:0:0:dar [img]; [0:v] [img] overlay=(W-w)/2:(H-h)/2 [out]\" -map \"[out]\" -map 0:a -vcodec libx264 -acodec copy $watermarked");  //creating water marked video
  • 我删除了 -f 参数,因为 ffmpeg 可以从输出文件扩展名推断格式。

  • 电影滤镜已从示例中删除,因为不需要它。

  • -vf 在此示例中被替换为 -filter_complex。请参阅 simple and complex 筛选以了解不同之处。

  • 此示例中的音频将 stream copied-acodec copy 而不是重新编码。