如何对 H265/HEVC 的 RTP 数据(通过 UDP)中的碎片帧进行解包?

2024-01-30

我正在尝试对原始 RTP H265 流进行解包并重建它,以便解码器可以读取它。 我已经能够通过识别 NAL 和 FU 详细信息从 RTP 缓冲区中提取单个和碎片单元。但是,我无法找到有关处理放置在碎片单元缓冲区前面的 NAL 的精确细节。

这是我所做的:

  1. 当有效负载头类型为49时,我知道它是一个碎片单元。

  2. 然后,我查找第三个字节,其尾随 6 个字节为您提供 FU 类型/NAL 类型,前两位告诉您它是帧的开始还是结束切片。 这是我用于重建 NAL 的代码:

if(type == 49){

    unsigned char fu_header = (unsigned char) *(rtpPayloadPos+2);
    unsigned char fu_head_se = (fu_header & 0xC0) >> 6;
    nal_type = fu_header & 0x3F;
 
    switch(fu_head_se){

    case 0x02:         //nal start
    {
        payloadType = RTP_PAYLOAD_FU_START_H265_NAL;
        *h265DataPos = rtpPlayloadPos-3;
        *(*h265DataPos) = 0x00;
        *((*h265DataPos)+1) = 0x00;
        *((*h265DataPos)+2) = 0x00;
        *((*h265DataPos)+3) = 0x01;
        *((*h265DataPos)+4) = (fu_header << 1);
        *((*h265DataPos)+5) = 0x01;
        h265Len = len - headLen + 3; 
    }
    break;

    case 0x00:     //nal middle
    {
        *h265DataPos = rtpPlayloadPos+2;
        h265Len = len - headLen - 2;
        payloadType = RTP_PAYLOAD_FU_MIDDLE_H265_NAL;
    }
    break;
 
    case 0x01:     //nal end
    {
        *h265DataPos = rtpPlayloadPos+2;
        h265Len = len - headLen - 2;
        payloadType = RTP_PAYLOAD_FU_END_H265_NAL;
    }
    break;
        
    default:
        printf("Unknown fu head\n");
        return -1;

}

但是,我不确定我重建 NAL 的方式是否正确。由于解码器抱怨很多并且视频几乎是绿色的并且不稳定。 有人可以告诉我如何正确重建 FU 框架吗?

我一直在参考 ITU H265 文档和此链接:https://datatracker.ietf.org/doc/html/draft-ietf-payload-rtp-h265-15 https://datatracker.ietf.org/doc/html/draft-ietf-payload-rtp-h265-15.


RFC 规范rfc 7798 https://www.rfc-editor.org/rfc/rfc7798有这一切的细节。

简单的步骤如下:

  1. 删除 12 字节 RTP 标头和 3 字节 FU 标头。
  2. 组合所有 FU 数据包,直到从视频编码帧找到/接收到结束数据包。
  3. 组合所有数据包(如果多个数据包形成一个帧)以形成视频帧,可以将其馈送到解码器。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何对 H265/HEVC 的 RTP 数据(通过 UDP)中的碎片帧进行解包? 的相关文章

  • 仅包含单个 mp4 文件的 MPEG-DASH 视频流

    我研究了一周 寻找一种简单且独立于平台的方法 将 mp4 文件传输到任何浏览器 如果浏览器不兼容 将使用渐进式流 直接下载 方法 我的场景是这样的 单个 mp4 文件 未分段和复用 音频 视频 支持 HTTP 字节范围服务 在浏览器不兼容的
  • Android WebRTC 中的本地视频渲染器

    我正在使用这个库 https bintray com google webrtc google webrtc https bintray com google webrtc google webrtc 我想要实现的目标 至少在我的项目开始时
  • 从服务器视频链接生成缩略图 android

    在android中是否可以获取某人的任何类型视频的缩略图 该人仅具有该视频的url链接 并且视频可以来自任何来源 例如youtube或任何来源 请告诉我是否可能 这是我的我试图通过java代码获取youtube视频的缩略图 public c
  • 使用 gstreamer-1.0 的 H264 RTP 流

    我尝试从带有摄像头模块的 Raspberry Pi 3 到视频标签制作 H264 RTP 流 使用以下代码启动流 raspivid t 0 h 720 w 1080 fps 25 hf b 2000000 o gst launch 1 0
  • 将嵌入的视频资源作为流播放

    EDIT 我改变了我的问题以更好地澄清问题 如何使用字节数组 取自嵌入式资源 播放视频DirectShow Net http directshownet sourceforge net about html图书馆 由于我要阻止用户访问视频文
  • 使用套接字 fd 在手机之间传输实时视频

    我是android编程的新手 发现自己陷入了困境 我一直在研究各种从手机到手机流式传输实时视频的方法 似乎它大部分功能都可用 当然除了最重要的部分 播放流 它似乎是从一部手机发送流 但第二部手机无法播放流 这是游戏方的代码 public c
  • Rails send_file 不播放 mp4

    我有一个 Rails 应用程序 可以保护上传的视频 将它们放入私人文件夹中 现在我需要播放这些视频 当我在控制器中执行以下操作时 def show video Video find params id send file video ful
  • 在tinymce中禁用自动moxieplayer换行

    我构建了一个功能 可以上传 转换视频 然后将视频嵌入到tinymce 中 Tinymce 使用他们的 moxieplayer swf 不断用一些 html 封装我的视频嵌入 我想对这些视频使用自定义视频播放器 但当 tinymce 的行为如
  • Android 应用程序通过移动端口使用 P2P 模式流式传输 IP 摄像机?

    我正在尝试通过 Android 应用程序上的 IP 摄像头流式传输视频 我已经使用以下方法成功获取了视频 使用媒体播放器和 Surface View 的 RTSP 使用视频视图的 RTSP 重定向到 VLC 以流式传输视频 重定向到本机 用
  • 如何使用ffmpeg命令生成RTMP测试流?

    我想通过生成带有时间戳的 RTMP 测试视频来测试我的流媒体基础设施 这可能看起来像那样screen https s media cache ak0 pinimg com originals 65 25 9c 65259ca7ebaba59
  • 在 Kivy 中嵌入 YouTube 视频

    我想使用 YouTube URL 将视频嵌入到 Kivy 的小部件中 那可能吗 该文档给出了 VideoPlayer 的示例 http kivy org docs api kivy uix videoplayer html http kiv
  • 使用 DirectShow 捕获帧并使用 OpenCV 进行处理

    我为视频到图像捕获制作了两种不同的解决方案 并且想知道是否可以将两个世界的优点结合在一起 我目前正在使用 DirectShow 加载 AVI 文件并捕获图像 然而 DirectShow 缺乏图像处理功能并且需要制作额外的滤镜 这让我陷入了困
  • 通过 Web API 2 流式传输视频内容

    我正在研究执行以下操作的最佳方法 我有一堆闭路电视录像文件 MP4 文件 大小从 4MB 50MB 不等 我想通过门户网站提供这些文件 我的第一个想法是通过 Web API 流式传输文件 所以我找到了下面的链接 http www strat
  • 使用 Python 进行视频流传输

    Python 中是否有任何库 或 应用程序可支持视频流 它必须读取文件并需要通过网络进行流式传输 查看波动 http flumotion net 它是一个用Python实现的流媒体服务器
  • html5 video safari 在播放前下载完整

    我想知道为什么我的 mp4 html5 视频不是 流式传输 而是等到完全下载后才开始在 safari 中播放 www pija se 我已经尝试过 QTIndexSwapper 但它说索引位于正确的位置 任何帮助表示赞赏 看起来 MOOV
  • 如何重现错误“由于暂停纯视频背景媒体以节省电量,播放()请求被中断”?

    介绍 作为我项目的一部分 我有一个接收视频流的播放器 我希望它在流开始和结束时自动播放和自动停止 因此我引入了一个检查来查看流是否处于活动状态并在每种情况下启动和 或停止播放器 这是一个企业网站 有时有多达 3000 名用户同时观看视频流
  • UIWebView中检测并拦截视频播放

    我想拦截 UIWebView 中的点击 然后使用视频的 URL 这怎么可能 我发现了一个有点类似的帖子 它指出了 webView shouldStartLoadWithRequest navigationType 代表 我似乎无法通过该委托
  • ffmpeg创建RTP流

    我正在尝试使用 ffmpeg 进行编码和流式传输 libavcodec libavformat MSVC x64 with Zeranoe builds 这是我的代码 很大程度上改编自编码示例 删除了错误处理 include stdafx
  • Gstreamer、rtspsrc 和负载类型

    我在从特定摄像头检索 rtsp 流时遇到困难 因为摄像头提供的 rtp 有效负载类型是 35 未分配 并且该摄像头接受的有效负载类型rtph264德佩插件的范围是 96 127 结果是 gstreamer 显示如下错误
  • WebRTC 暂停和恢复流

    我正在尝试使用 WebRTC 构建一个 Web 应用程序 当某些事件触发时需要暂停 恢复视频 音频流 我已经尝试过getTracks 0 stop 但我不知道如何恢复流 对此有什么建议吗 谢谢 getTracks 0 stop 是永久的 U

随机推荐