2011-06-15 70 views
5

我有一个视频文件,我需要将它编码为H264/AVC并通过HTTP传送给客户端。我需要的是,我的播放器在客户端可以播放正在编码的视频。为了使播放器能够在视频下载时播放,必须将“moov atom”放置在视频文件的开始位置。然而,编码器(例如:ffmpeg)在完成编码后总是在文件末尾写入“moov atom”。编码时是否可以从编码器播放输出视频文件?

有什么办法编码器可以把“moov原子”在编码的输出开始?或者播放没有moov原子存在的视频?

感谢在进步

LR

回答

13

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

+0

非常感谢!这非常有帮助。我尝试使用mpegts作为输出选项将视频文件编码到H264和AAC。不完整的输出文件可以在编码时由vlc播放。我真正想要的是在Android上播放它,但是Android的播放器不能播放不完整的输出。我想我必须为Android实现我自己的播放器。 – jAckOdE 2011-06-16 11:06:22

+0

我不相信Android保证支持MPEG-TS流。 (虽然他们可能会增加对Apple风格的分块http MPEG-TS流媒体的支持)。你用什么协议把视频传到手机上? Android支持UDP上的RTSP(其中VLC可能也是如此) – wombat57 2011-06-17 18:10:44

+0

视频文件通过HTTP传输到Android手机,并保存在android手机中的许多小块,喜欢苹果的HTTP流。我们不能使用其他协议,但HTTP。我没有检查Android网站,并且在这里宣布Android支持Android 3.0+的mpeg-ts:http://developer.android.com/guide/appendix/media-formats。html – jAckOdE 2011-06-20 02:56:19

1

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

+0

你是如何得到vlc来生成Android可以处理的rtsp流的?我不断收到“不支持的格式”/错误-1010。 我想也许问题是在mdat原子之前没有moov原子,但是我很不确定! – 2014-06-04 01:31:30

2

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

解压缩,然后转到工具目录下,有一个名为QT-faststart.c文件,只需建立它:

使QT-的fastStart

你现在可以通过调用MOOV Atom来重新分配MOOV Atom,如下所示:qt-faststart input.mp4 output.mp4

相关问题