streaming - 使用 FFmpeg,如何解码 H264 数据包

标签 streaming ffmpeg decode h.264

我是 FFmpeg 的新手,正在努力解码可以作为 uint8_t 数组获得的 H264 数据包。

经过多次调查,我认为应该可以将数组放入如下所示的 AVPacket

AVPacket *avpkt = (AVPacket *)malloc(sizeof(AVPacket) * 1);
av_init_packet(avpkt);  
avpkt->data = ct;   // ct is the array
avpkt->length =....

并由 avcodec_decode_video2() 解码.

部分代码如下:
...
codec = avcodec_find_decoder(CODEC_ID_H264);
gVideoCodecCtx = avcodec_alloc_context();
gFrame = avcodec_alloc_frame();
avcodec_decode_video2(gVideoCodecCtx, gFrame, &frameFinished, packet);
...

我想我正确设置了所有必需的属性,但这个函数只返回 -1
我刚刚找到 -1来自
ret = avctx->codec->decode(avctx, picture, got_picture_ptr, avpkt);

avcodec_decode_video2();
实际上,我想知道的是如何通过 avcodec_decode_video2() 解码 H264 数据包(没有 RTP header ) ?

更新:

好的,我仍在努力寻找解决方案。我现在正在做的是以下

** 此 RTP 码流中的 H264 码流由 FU-A 编码
  • 接收RTP包
  • 查看 RTP header 的第二个字节是否 > 0,这意味着它是第一个数据包(可能会被跟随)
  • 查看下一个 RTP 数据包的第二个字节是否也 > 0,则表示前一帧是完整的 NAL,或者如果它 < 0,则应将数据包附加到前一个数据包。
  • 删除数据包的所有 RTP header ,使其仅具有类似 FU 指示符 | FU头|纳尔
  • 试试用 avcodec_decode_video2() 玩吧

  • 但它只返回 -1 ......
    我也应该删除 FU 指示器和标题吗?

    任何建议将不胜感激

    最佳答案

    Actually, what I'm wondering is if I can decode H264 packets (without RTP header) by avcodec_decode_video2().


    如果您使用除单个 NAL 单元模式之外的打包模式,则在将 NAL 单元传递给解码器之前,您可能需要预处理 RTP 有效负载(重新组装分段的 NALU,拆分聚合的 NALU)。流中允许的 NAL 单元类型(STAP、MTAP、FU)取决于打包模式。阅读 RFC 6184有关打包模式的更多信息。
    其次,虽然我对 FFMPEG 不太熟悉,但它可能更像是一般的 H.264 解码问题:您必须始终使用 H.264 序列 (SPS) 和图片参数集 (PPS) 初始化解码器,然后才能使用能够解码其他帧。你这样做了吗?

    关于streaming - 使用 FFmpeg,如何解码 H264 数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9308976/

    相关文章:

    android - file.exists() 对于 Android 中的现有文件返回 false

    python - 如何在Python中通过HTTPPost方法发送大文件,上传大文件

    node.js - 将流信息写入视频文件

    c++ - 使用 ffmpeg 解码原始 H264 帧时出错

    audio - ffmpeg 如何转换其他格式的音频文件?

    c++ - 视频和音频帧的 PTS 和 DTS 计算

    python - 如何将原始二进制解码为十六进制

    c# - HttpListener 将数据写入响应输出流

    java - URL 中带有空格的音频文件无法在我的应用程序中播放

    java - 根据客户要求流式传输大型存档文件的进展情况?