我对 FLV 流生成有疑问。我开发了 DVR 系统,它应该能够以 FLV 格式流式传输视频(在 Actionscript NetStream 上播放)。我以原始 H264 NAL 单元(0x00 0x00 0x00 0x01)从编码器接收视频,我也可以识别是编码帧 IDR 还是非 IDR。
我创建 FLV 流的解决方案(基于 Adobe 规范:视频文件格式规范版本 10)是:
- 等待 IDR 帧;
- 放 FLV 标头
- 把 PrevTagSize(0)
- 将 FLV 标签与视频标签 VIDEODATA 与 AVCVIDEODATA
- 把 PrevTagSize
- 重复步骤 4,5 直到流式传输结束。
Stream看起来不错,ffplay、mplayer、vlc等都可以播放,但是基于Actionscript NetStream的播放器不能播放。
因此,我得到了原始 h264 数据并使用 ffmpeg 将其转换为 FLV:
ffmpeg -f h264 -i d1.h264 -vcodec 复制 -f flv d1.flv
并尝试将 flv 的 my 和 ffmpeg 的进行比较。
首先,我看到 ffmpeg 在 FLV 标头之后立即添加了 AVC 序列标头。我已经开始这样做了,但是 NetStream 仍然不支持我的流,并且其他玩家也停止播放它。
好的,那我继续比较flv的。现在我看到 ffmpeg 编码的 FLV 中的 NAL 单元标头发生了一些变化,但我无法理解这些变化的含义。我阅读了许多规格,但没有任何帮助。有人可以澄清我吗?
例如,我的 NAL 单位看起来是这样的:00 00 00 01 XX XX ... - 对于所有单位
FFmpeg NAL:00 00 [14 BA] 61 9A ... - 非 IDR(两个字节变量) 00 00 [7A 02] 65 88 ... - IDR(两个字节变量)00 00 00 40 06 05 ... - SEI
是否添加了一些计数器或其他任何东西?
很高兴看到任何想法、链接等。