是否有可能在编码时从编码器播放输出视频文件?

时间:2011-06-15 05:40:25

标签: ffmpeg video-streaming

我有一个视频文件,我需要将其编码为H264 / AVC并通过HTTP提供给客户端。我需要的是我在客户端的播放器可以在编码时播放视频。

AFAIK,为了让播放器能够在视频下载时播放,必须将“moov atom”放置在视频文件的视频中。但是,编码器(例如:ffmpeg)在完成编码后总是在文件末尾写“moov atom”。

编码器的输出开头是否有任何方式可以放置“moov atom”?或者在没有moov原子存在的情况下播放视频?

感谢进步

LR

3 个答案:

答案 0 :(得分:13)

是的,这是可能的,但仅限于某些容器格式。使用QuickTime / MP4容器是不可能的。在这些格式中,moov原子包含样本偏移量(mdat原子中样本的位置)。直到视频编码完成后才知道这些。使用VOD(视频点播),您可以获取完成的文件,并将moov原子移动到前面,以使流媒体工作更好。但如果您正在进行编码,则无法执行此操作。为了实现这一目标,您需要使用面向流的传输格式。像FLV或MPEG-TS这样的东西可行。如果您将视频传递到ffmpeg并告诉它在FLV容器中生成H.264视频,那么您可以在编码时将该数据提供给播放器,并且它将起作用。当然,如果您想通过HTTP提供服务,您可能必须编写自己的服务器(或现有服务器的模块)。我所知道的任何内容都不支持在写入文件时提供服务(问题是在发送内容长度标头时不知道文件大小)。但是,如果您通过RTMP或RTSP提供视频,则可以使用现有软件。

答案 1 :(得分:2)

您可以使用名为qt-faststart的ffmpeg中的工具重写文件,将MOOV Atom移动到文件的开头。您需要自己从源代码编译它(但至少在Linux / Mac OS中很容易)。只需下载libavcodec的源代码,例如: http://libav.org/releases/libav-0.8.tar.xz

解开它并进入tools目录,有一个名为qt-faststart.c的文件,只需用以下代码构建:

制作qt-faststart

现在可以通过调用它来重新分配MOOV Atom:qt-faststart input.mp4 output.mp4

答案 2 :(得分:1)

我之前也用ffmpeg尝试了同样的事情,但是没能成功。但是使用vlc,我可以同时在Android上下载,转码和流式传输,但使用rtsp。我没有尝试使用http渐进方法。我在vlc中使用了mpeg4视频编解码器,mpega音频编解码器。