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

Posted

技术标签:

【中文标题】如何从可以由 Actionscript NetStream 播放的原始 h264 生成 FLV 流?【英文标题】:How to generate FLV stream from raw h264 which can be played by Actionscript NetStream? 【发布时间】:2012-08-05 10:53:24 【问题描述】:

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

我创建 FLV 流的解决方案(基于 Adob​​e 规范:视频文件格式规范版本 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's my 和 ffmpeg's。

首先,我看到 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

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

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

【问题讨论】:

我也在研究 FLV 多路复用器,想知道如何存储使用 x264_encoder_encode 进行编码时获得的 x264_nal_t* 数据​​。你让你的流工作了吗?你能解释一下你的方法吗? 【参考方案1】:

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

    附件 B 包含起始代码:00 00 01 MP4 的长度前缀为 XX XX XX XX

您正在创建附件 B,但您似乎需要用于 FLV 的 mp4 打包格式(以长度为前缀)。 您必须删除 (00) 00 00 01 并添加长度作为前缀。

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

以上是关于如何从可以由 Actionscript NetStream 播放的原始 h264 生成 FLV 流?的主要内容,如果未能解决你的问题,请参考以下文章

ActionScript 如何从 ASHX 获取数据

JFlashPlayer:如何生成 ActionScript 事件

如何在 Actionscript 3 中将数据写入 XML 文件

如何从 flex (mxml/actionscript?

如何从许多图像制作动画(Actionscript)

Actionscript 3.0 如何从 addChild 定义对象?