如何从原始h264生成可以由Actionscript NetStream播放的FLV流?

时间:2012-08-08 10:34:41

标签: flv h.264

我遇到FLV流生成问题。我开发了DVR系统,它应该能够以FLV格式流式传输视频(在Actionscript NetStream上播放)。我以原始H264 NAL单位(0x00 0x00 0x00 0x01)从编码器接收视频,我也能识别出编码帧IDR或非IDR。

我创建FLV流的解决方案(基于Adobe规范:视频文件格式规范版本10)是:

  1. 等待IDR框架;
  2. 放入FLV标题
  3. 把PrevTagSize(0)
  4. 将FLV标记与视频标记VIDEODATA和AVCVIDEODATA
  5. 放在一起
  6. 放PrevTagSize
  7. 重复步骤4,5直到流式传输结束。
  8. Stream看起来不错,可以通过ffplay,mplayer,vlc等播放。 但不是基于Actionscript NetStream的播放器播放的。

    所以,我得到原始的h264数据并使用ffmpeg将其转换为FLV:

    ffmpeg -f h264 -i d1.h264 -vcodec copy -f flv d1.flv

    并尝试将flv与myf和ffmpeg进行比较。

    首先,我看到ffmpeg在FLV标头之后立即添加了AVC序列标头。 我已经开始做同样的事了,但是NetStream仍然不支持我的流,而且其他玩家也停止播放它。

    好的,那我就继续比较flv了。 现在我看到ffmpeg的编码FLV中的NAL单元头有点改变了,但是我无法理解这些改变的意义。我读了很多规格,但没有任何帮助。 有人能澄清一下吗?

    例如,我的NAL单位看起来如此: 00 00 00 01 XX XX ... - 适用于所有单位

    FFmpeg NALs: 00 00 [14 BA] 61 9A ... - 非IDR(两个字节变量) 00 00 [7A 02] 65 88 ... - IDR(两个字节变量) 00 00 00 40 06 05 ... - SEI

    是否添加了一些计数器或其他任何东西?

    很高兴看到任何想法,链接等。

2 个答案:

答案 0 :(得分:3)

尝试使用以下命令来完成工作:

ffmpeg -y -i test.flv -vcodec copy -vbsf h264_mp4toannexb test.h264

你将获得一个vlc可播放的.h264文件,所有NAL都以00 00 00 01开头。

答案 1 :(得分:1)

有两种常见的H.264比特流打包格式。

  1. 附件B包含起始码:00 00 01
  2. MP4的长度为XX XX XX XX
  3. 您正在创建附件B,但似乎您需要FLV的mp4打包格式(长度前缀)。 您必须删除(00)00 00 01并将长度添加为前缀。