FFmepg AV_CODEC_FLAG_GLOBAL_HEADER问题描述

简介:

问题描述
            设置该标志位,在解码过程中似乎并没有任何的效果,本意是通过设置该标志位AV_CODEC_FLAG_GLOBAL_HEADER
通过AVCodecContext在解码过程中,从extradata中读取SPS/PPS,然后将信息填充到每一帧之前,然后正确解码


变量说明
/**
 * Place global headers in extradata instead of every keyframe.
 *将全局头部信息放在extradata指针中,而不是每一个关键帧中
 */
#define AV_CODEC_FLAG_GLOBAL_HEADER   (1 << 22)

1)libx264.c:static av_cold int X264_init(AVCodecContext *avctx)

该变量主要出现在该函数的以下两个地方
1    if (avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER)
        x4->params.b_repeat_headers = 0;
说明
b_repeat_headers的意思是将SPS/PPS添加到每一个关键帧之前,0代表不添加
如果设置了videosteam 的codec中设置了AV_CODEC_FLAG_GLOBAL_HEADER就会导致x264_param_t参数中的b_repeat_header赋值为0,
这样每个关键帧前面就不会添加SPS/PPS,如果在探测码流的时候,无法获取正确的SPS/PPS,就会导致解码失败。
0x00000001或者0x000001是起始码,0x67是sps的开头,0x68是pps的开头。


2    if (avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER) {
        x264_nal_t *nal;
        uint8_t *p;
        int nnal, s, i;

        s = x264_encoder_headers(x4->enc, &nal, &nnal);
        avctx->extradata = p = av_mallocz(s + AV_INPUT_BUFFER_PADDING_SIZE);
        if (!p)
            return AVERROR(ENOMEM);

        for (i = 0; i < nnal; i++) {
            /* Don't put the SEI in extradata. */
            if (nal[i].i_type == NAL_SEI) {
                av_log(avctx, AV_LOG_INFO, "%s\n", nal[i].p_payload+25);
                x4->sei_size = nal[i].i_payload;
                x4->sei      = av_malloc(x4->sei_size);
                if (!x4->sei)
                    return AVERROR(ENOMEM);
                memcpy(x4->sei, nal[i].p_payload, nal[i].i_payload);
                continue;
            }
            memcpy(p, nal[i].p_payload, nal[i].i_payload);
            p += nal[i].i_payload;
        }
        avctx->extradata_size = p - avctx->extradata;
    }



相关信息说明
1)http://www.cnblogs.com/wanggang123/p/6128719.html指出如果要求打开编码器之后
AVCodecContext extradata存有 SPS,PPS 信息需要加上如下代码 
AVCodecContext->flags |= AV_CODEC_FLAG_GLOBAL_HEADER
暂时用不上,因为当前是解码,默认情况下AVCodecContext extradata在探测码流(avformat_find_stream_info)
会自动将SPS,PPS填充到extradata字符串中,通过avcodec_parameters_to_context函数,将codecpar内容
传递给AVCodecContext

2)http://blog.csdn.net/ET_Endeavoring/article/details/77949850指出需要对AVCodecContext结构体进行如下的设置
AVCodecContext->flags |= AV_CODEC_FLAG_GLOBAL_HEADER
FFmpeg才会在调用avcodec_open2函数里面,将SPS,PPS信息写入header
如下代码提供手动填充extradata的方式
unsigned char sps_pps[23] = { 0x00, 0x00, 0x00, 0x01, 0x67, 0x42, 0x00, 0x0a, 0xf8, 0x0f, 0x00, 0x44, 0xbe, 0x8,
                  0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x38, 0x80 }; 
        codec_ctx->extradata_size = 23;
        codec_ctx->extradata = (uint8_t*)av_malloc(23 + AV_INPUT_BUFFER_PADDING_SIZE);
        if (codec_ctx->extradata == NULL) {
            printf("could not av_malloc the video params extradata!\n");
            return -1;
        }
        memcpy(codec_ctx->extradata, sps_pps, 23);
实际上,在解码的时候,手动填充无效



3)http://blog.csdn.net/passionkk/article/details/75528653指出了在实时视频传输时,需要发送
SPS/PPS数据,必须设置
param.b_repeat_headers = 1;  // 重复SPS/PPS放到关键帧前面
种种情况下,codec中不能设置AV_CODEC_FLAG_GLOBAL_HEADER标志,从上面的代码,就可以知道
如果设置了videosteam 的codec中设置了AV_CODEC_FLAG_GLOBAL_HEADER就会导致x264_param_t参数中的b_repeat_header赋值为0,
这样每个关键帧前面就不会添加SPS/PPS,如果在探测码流的时候,无法获取正确的SPS/PPS,就会导致解码失败。
0x00000001或者0x000001是起始码,0x67是sps的开头,0x68是pps的开头。


     本文转自fengyuzaitu 51CTO博客,原文链接:http://blog.51cto.com/fengyuzaitu/2058061,如需转载请自行联系原作者





相关文章
|
编解码 API
ffmpeg.c(4.3.1)源码剖析(一)
ffmpeg.c(4.3.1)源码剖析(一)
372 2
|
Web App开发 编解码 Android开发
2023年音视频开发知识技术合集(基础入门到高级进阶)
2023年音视频开发知识技术合集(基础入门到高级进阶)
|
存储 监控 Shell
【Shell 命令集合 磁盘管理 】Linux 管理磁盘配额 quota命令使用教程
【Shell 命令集合 磁盘管理 】Linux 管理磁盘配额 quota命令使用教程
389 0
|
9月前
|
NoSQL MongoDB 微服务
微服务——MongoDB常用命令——文档的分页查询
本文介绍了文档分页查询的相关内容,包括统计查询、分页列表查询和排序查询。统计查询使用 `count()` 方法获取记录总数或按条件统计;分页查询通过 `limit()` 和 `skip()` 方法实现,控制返回和跳过的数据量;排序查询利用 `sort()` 方法,按指定字段升序(1)或降序(-1)排列。同时提示,`skip()`、`limit()` 和 `sort()` 的执行顺序与编写顺序无关,优先级为 `sort()` &gt; `skip()` &gt; `limit()`。
340 1
|
存储 编解码
FFmpeg开发笔记(三十)解析H.264码流中的SPS帧和PPS帧
《FFmpeg开发实战》书中介绍了音视频编码历史,重点讲述H.264的成功在于其分为视频编码层和网络抽象层。H.264帧类型包括SPS(序列参数集,含视频规格参数),PPS(图像参数集,含编码参数)和IDR帧(立即解码刷新,关键帧)。SPS用于计算视频宽高和帧率,PPS存储编码设置,IDR帧则标志新的解码序列。书中还配以图片展示各帧结构详情,完整内容可参考相关书籍。
853 7
FFmpeg开发笔记(三十)解析H.264码流中的SPS帧和PPS帧
|
数据采集 文件存储
给h264帧增加start code和sps/pps
给h264帧增加start code和sps/pps
919 0
给h264帧增加start code和sps/pps
|
网络协议
av_interleaved_write_frame -32 broken pipe
av_interleaved_write_frame -32 broken pipe
690 0
av_interleaved_write_frame -32 broken pipe
|
机器学习/深度学习 算法 大数据
[ICLR 2024] 基于Pathways架构的自适应多尺度时间序列预测模型Pathformer
阿里云计算平台大数据基础工程技术团队主导,与华东师范大学数据科学与工程学院合作的论文《Pathformer: Multi-Scale Transformers With Adaptive Pathways For Time Series Forecasting》被ICLR 2024接收,该论文提出了基于Pathways架构的自适应多尺度时间序列预测模型Pathformer,它从时间分辨率和时间距离角度进行多尺度时序建模,同时进一步提出自适应Pathways来动态调整多尺度建模过程,基于两者,Pathformer在阿里云数据集和公开数据集上取得SOTA预测效果,并展现出不错的泛化性和迁移性。
|
存储 运维 数据挖掘
服务器数据恢复—修复xfs文件系统导致数据丢失的数据恢复案例
某公司一台服务器,连接了一台存储。该服务器安装linux操作系统,文件系统为xfs。 在运行过程中该服务器出现故障,管理员使用xfs_repair工具试图对xfs文件系统进行修复但失败,服务器中所有数据丢失。
|
存储 缓存 内存技术
SDL开发笔记(二):音频基础介绍、使用SDL播放音频
SDL开发笔记(二):音频基础介绍、使用SDL播放音频
SDL开发笔记(二):音频基础介绍、使用SDL播放音频