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

标签 flv h.264

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

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

  • 等待 IDR 帧;
  • 放 FLV header
  • 把 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 header 之后立即添加了 AVC 序列 header 。
    我已经开始这样做了,但是 NetStream 仍然不支持我的流,并且其他玩家也停止播放它。

    好的,那我继续比较flv的。
    现在我看到 ffmpeg 编码的 FLV 中的 NAL 单元 header 发生了一些变化,但我无法理解这些变化的含义。我阅读了许多规范,但没有任何帮助。
    有人可以澄清我吗?

    例如,我的 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

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

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

    最佳答案

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

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

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

    关于flv - 如何从可以由 Actionscript NetStream 播放的原始 h264 生成 FLV 流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11862666/

    相关文章:

    flash - 如何使用 Flash 加密/解密 FLV

    vb.net - 我们可以使用 ffmpeg 直接从互联网将 flv 转换为 mp4

    android - 如何通过一些特殊标签区分 H264 编码的视频帧?

    ios - VTDecompressionSessionDecodeFrame 返回 imageBuffer = nil 但 OSStatus = noErr

    ffmpeg - RED5 1.0.2 录制的 FLV 转换为 Mobile/HTML5 格式,FFMPEG av 不同步

    audio - ffmpeg 无法识别视频中的音频流

    c++ - 封装 H.264 的 C/C++ FLV 多路复用器未按预期工作

    android - 使用 Jcodec 保存 rtsp h264 流(在 Android 上)

    api - h.264解码器的 "invalid NAL unit size"是什么意思?

    ffmpeg 无法更改 B 帧的数量