最近我有一个任务是使用ffmpeg作为转码以及流媒体工具。任务是将文件从给定格式转换为MP4并立即通过从stdout捕获它来流式传输。到现在为止还挺好。流媒体适用于Android标签的本机播放器以及VLC播放器。问题出在Flash播放器上。它给出了以下错误:
NetStream.Play.FileStructureInvalid:Adobe Flash无法导入文件结构无效的文件。
使用的ffmpeg标志是
$ ffmpeg -loglevel quiet -i somefile.avi -vbsf h264_mp4toannexb -vcodec libx264 \
-acodec aac -f MP4 -movflags frag_keyframe+empty_moov -re - 2>&1
答案 0 :(得分:2)
mov / mp4 / ismv复用器支持碎片。通常,MOV / MP4文件包含存储在一个位置的所有数据包的所有元数据(写在文件末尾,可以使用
qt-faststart
工具将其移动到开头以便更好地回放)。碎片文件由许多片段组成,其中有关这些数据包的数据包和元数据存储在一起。编写碎片文件的优点是,即使写入被中断,文件也是可解码的(正常MOV / MP4如果未正确完成则不可编码),并且在写入非常长的文件时需要更少的内存(因为写入正常的MOV) / MP4文件存储有关内存中每个数据包的信息,直到文件关闭为止。 缺点是它与其他应用程序的兼容性较差。
切换到可以处理碎片化MP4文件的Flash播放器,或使用支持更好流式传输的其他容器格式。
此外,-re
是一个仅输入选项,因此在输入之前而不是在输出之前指定它更有意义。