创建可用于HTTP流的MP4视频


Answers:


9

这是您@abrahab的最后评论的答案。

您不需要mp4box文件就可以通过nginx伪流式传输它。无论moov原子的位置如何(mp4box将moov原子移动到文件的开头),MP4流模块都会处理它。


现在,对于500服务器错误,您是否在mp4box中使用了“ -frag”选项?MP4流模块无法读取零碎的MP4文件。mp4box伪流的良好使用是对视频进行交织以便更好地查找。Moov原子移位是一个额外的优势。

我总是对mp4boxFFmpeg编码的文件执行此操作

MP4Box -add MyVideo.mp4 -isma Myvideo-box.mp4

默认情况下,这还将以500毫秒的块间隔插入MP4文件。


1
要进行“就地”文件插入而不需要创建新文件,请直接使用MP4Box -isma -inter 500 Myvideo.mp4
Vineet 2012年

45

MP4中的H.264

通常,您要在MP4容器中创建x264视频。基本上所有设备和浏览器都支持此选项。

以下内容就足够了。确保替换输入名称和CRF选项。后者设置了质量,理智的值介于19到25之间–值越低意味着质量越好,但比特率也越高:

ffmpeg -i input.avi -c:v libx264 -crf 23 -c:a aac -movflags faststart output.mp4

如果您喜欢GUI方式,也可以使用Handbrake进行编码。

使用faststart选项

现在,您需要做的就是将MP4容器的MOOV原子移到开头。这个原子(本质上是MP4容器中的一个数据单元)将包含有关视频/音频流本身的重要元数据。-movflags faststart应该做到这一点。

如果您的FFmpeg版本没有此选项,请考虑升级。如果无法升级,则可以使用以下任何工具来实现相同的目的:

  • QTIndexSwapper,一个Adobe AIR应用程序

  • MP4Box,免费和开放源代码,运行类似于以下命令,您可以在其中更改间隔(此处为500):

    mp4box -inter 500 input.mp4

  • Python中的qt-faststart,可在安装了Python的任何地方使用。

    qtfaststart input.mp4

就是这样

控制比特率/质量

现在,当然,对于流式传输,您实际上可能希望将比特率限制在一定范围内。您可以在我的有关速率控制方法的博客文章中阅读有关此内容的更多信息。

例如,通过添加-maxrate 2M -bufsize 2M编码选项,您可以将编码上限设置为2 Mbit / s,这对于720p视频来说可能就足够了。当然,所需的比特率将取决于内容的复杂程度。这需要一些反复试验。


谢谢,我做同样的方式,但随着视频:(我似乎仍然问题ffmpeg -i 1.flv -vcodec libx264 -f mp4 -an -g 1 -f mp4 -g 30 -level 3 new.mp4,然后mp4box和MP4不能寻求和nginx的报告500 internal server error为启动参数的更多的是0,当视频编码没有-vcoded libx264(默认MP4编码)的所有工作文件(但质量!恶心!):((对不起,现在,不允许您回答)
abrahab 2012年

这似乎是NginX的h.264插件问题,而不是任何视频转换问题。我本身不是网络视频的专家,但是我看到您已经在Stack Overflow上问过这个问题了吗?stackoverflow.com/questions/11079748/...
slhck

我还认为,nginx可能无法正确读取此视频格式。来自youtube的视频也播放良好。是的,我被问及有关nginx问题的信息,但似乎没有答案。:(
abrahab 2012年

3
+1 -movflags faststart正是我所需要的
安德鲁(Andrew)2013年

链接是死的,需要使用web.archive.org:web.archive.org/web/20140201142344/http://www.longtailvideo.com/...
马拉特

5

通过执行以下操作,您可以简单地转换不可流式的AVI或MP4,而无需重新编码所有内容:

ffmpeg -i INPUT.mp4 -c copy -movflags faststart STREAMABLE_OUTPUT.mp4

无需重新编码任何内容,因为仅必须移动moov原子。


-1

您可以尝试使用ffmpeg:

ffmpeg.exe -i "INPUT_FILE.AVI" -threads 2 -s 800x600 -r 25.00 -threads 1 -pix_fmt yuv420p -g 300 -qmin 3 -b 2048k -async 1 -acodec pcm_s16le -ar 22050 -ac 1 -ab 128k -y "OUTPUT_FILE.mp4"

5
用于网络流视频的22 kHz PCM立体声音频吗?听起来不太有效。那为什么要将音频比特率设置为128k呢?
slhck 2012年

@slhck,您可以将22k更改为44k,将“ -ar 22050”替换为“ ar 44100”
Searush 2012年

1
@SEARAS问题不是采样率。事实是音频是未压缩的PCM立体声。用于互联网流。那没图。
slhck

该答案的质量很低,应该删除。这些参数可能会更改内容的帧速率,视频分辨率和音频采样率,并产生无效或低质量的结果(ffmpeg可以自己选择更安全或更佳的参数)。由于限制到更少的线程,因此性能也受到损害,甚至无法与-acodec pcm_s16le(error :)一起使用Could not write header for output file #0 (incorrect codec parameters ?): Invalid argument。似乎也缺少像IETF草案那样为什么要精确选择这些参数的充分理由。
LiveWireBT
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.