video - 通过 rtmp 发送的 FLV 视频数据包使用 ffmpeg 与 OBS 流式传输

标签 video ffmpeg rtmp flv

我正在使用 node-media-server npm 模块来托管我的 rtmp 服务器。我从服务器捕获了视频数据包,我注意到视频数据包以 ffmpeg -f gdigrab -offset_x 1920 -framerate 60 -video_size hd1080 -i desktop -crf 0 -preset ultrafast -f flv rtmp://localhost 流式传输。以。。开始

  • 2200 0085
  • 2200 0084
  • 1200 0085 , 和
  • 第一个数据包以 1200 0084 开头.

  • 当我使用 OBS 流式传输到我的 rtmp 服务器时,我会捕获以开头的视频数据包
  • 2701 0000 0000 00
  • 第一个数据包以 1701 0000 0000 开头.

  • 我正在尝试做的是捕获这些数据包,将其存储起来,并在它们连接到我的服务器时将这些数据包发送给“玩家”。我得到了它使用 ffmpeg 捕获的数据包AND 视频转换为 flv格式为 ffmpeg .

    但是播放器不播放使用 OBS 流式传输的视频包。但是,当我的 rtmp 服务器只是“中继”它接收到的内容而不是“重播”捕获的数据包时,播放器的播放效果很好。但是音频播放得很好。

    我想知道那些开头的十六进制代表什么(是否表明 OBS 没有使用 flv 文件格式)。

    最佳答案

    (1)

    "...And when I stream to my RTMP server with OBS, I capture video packets that start with

    • 27 01 00 00 00 00 00 and

    • the very first packet starts with 17 01 00 00 00 00

    I would like to know what those starting hexadecimals represent (whether it indicates that OBS is not using the FLV file format)."



    这些字节值对于 FLV 格式是正确的(请参阅:"Video encoding" section under FLV Structure

    假设数据包以字节 XY 01 00 00 开头...
  • X 是框架类型... X == 1用于关键帧(I 帧)和 X == 2用于支持 P/B 帧。
  • Y 是编解码器类型... Y == 7用于编解码器 H.264 (MPEG)。

  • 您会注意到,在您的 FFmpeg 生成的 FLV 中,Y编解码器类型为 2 .默认情况下,FFmpeg 使用 Sorenson Spark 编解码器(图像质量低)输出 FLV。

    要让 FFmpeg 在 FLV 中输出 H264,请使用 -c:v libx264 , 例子:
    ffmpeg -f gdigrab -offset_x 1920 -framerate 60 -video_size hd1080 -i desktop -c:v libx264 -crf 0 -preset ultrafast -f flv rtmp://localhost
    

    (2)

    "However the players don't play the video packets streamed with OBS."



    我假设 OBS 意味着 Open Broadcaster Software ?有没有办法提供一个简短的样本输出 FLV 文件进行分析?否则 try catch 流处理发送的每个字节(按出现顺序)。如果我是播放器/解码器,我从您的 RTMP 链接收到的前 100 多个字节是什么?

    您能否确定发送给玩家的 FLV 数据包含正确的数据,例如:

    馈入播放器/解码器...
  • 一个 FLV header ,后跟
  • A/V 元数据(分辨率、FPS、持续时间等)。

  • 然后应该跟随(单个帧)......
  • (每帧)包含视频数据包的 A/V 标签设置(例如:09... 直到 27 01 00 00... etc )。

  • 基本上确保 FLV 数据正确工作。播放器对音频编解码器有何看法?

    另外,您的音频是以 MP3 格式发送的吗?这是我可以想象您的“音频播放良好”的唯一方法,因为 MP3 帧每个都有自己的标题,并且可以在发送给播放器的字节中识别此类数据(例如:播放器忽略未知字节但理解 MP3 部分,因此解码到您的扬声器)。使用 ADTS header 发送的 AAC 音频也可以正常工作,但 ADTS header 不应位于媒体容器(不是 FLV、MP4 或 AVI)内。

    (3)
    我推荐你下载一个十六进制编辑器 适用于您的操作系统(如果使用 Windows,请尝试 HxD)。

    比较来自 FFmpeg 和 OBS 的两个 FLV 文件的字节数。寻找一个典型的结构,如......
    (这是 FLV header 和元数据):
    46 4C 56 01 01 00 00 00 09 00 00 00 00 12 00 01     FLV............. 
    25 00 00 00 00 00 00 00 02 00 0A 6F 6E 4D 65 74     %..........onMet
    61 44 61 74 61 08 00 00 00 0C 00 08 64 75 72 61     aData.......dura
    74 69 6F 6E 00 40 46 D9 99 99 99 99 9A 00 05 77     tion.@FÙ™™™™š..w
    69 64 74 68 00 40 77 00 00 00 00 00 00 00 06 68     idth.@w........h
    65 69 67 68 74 00 40 75 00 00 00 00 00 00 00 0D     eight.@u........
    76 69 64 65 6F 64 61 74 61 72 61 74 65 00 40 8A     videodatarate.@Š
    0B F6 00 00 00 00 00 09 66 72 61 6D 65 72 61 74     .ö......framerat
    65 00 40 48 1A 20 84 C4 02 3E 00 0C 76 69 64 65     e.@H. „Ä.>..vide
    6F 63 6F 64 65 63 69 64 00 40 1C 00 00 00 00 00     ocodecid.@......
    

    然后一个音频/视频帧被打包到一个 AV 标签中(数据开始 09 如果是视频,08 如果是音频):
    09 XX XX XX XX XX XX 00 00 00 00后跟帧数据27 01 00 00 XX 00 00 XX XX XX XX etc

    关于video - 通过 rtmp 发送的 FLV 视频数据包使用 ffmpeg 与 OBS 流式传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52285075/

    相关文章:

    ios - 使用 iOS 上的应用程序录制屏幕视频

    ffmpeg - 有没有办法使用各种 ffmpeg 命令找出 ffmpeg 在我的系统中的性能是否最佳?

    ffmpeg - 是否可以从一台服务器提取 RTMP 流并将其广播到另一台服务器?

    objective-c - AVPlayer seekToTime : Poor performance while looping short videos

    javascript - 如何将 getUserMedia() API 与 Node.js 结合使用来实时流媒体?

    ffmpeg - 用相等长度的流规范化输入

    尝试用图像制作幻灯片时,ffmpeg 抛出 "Output file #0 does not contain any stream"

    amazon-web-services - AWS Network LoadBalancer 监听器和以下目标组具有不兼容的协议(protocol)

    ruby-on-rails - 使用回形针ffmpeg播放视频

    node.js - 如何同步执行ffmpeg命令?