91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

FFmepg AV_CODEC_FLAG_GLOBAL_HEADER問題描述

發布時間:2020-07-07 04:52:49 來源:網絡 閱讀:11160 作者:fengyuzaitu 欄目:編程語言

問題描述
            設置該標志位,在解碼過程中似乎并沒有任何的效果,本意是通過設置該標志位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的開頭。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

吉木乃县| 黄龙县| 巴中市| 桐乡市| 昂仁县| 永靖县| 宜兰市| 岳池县| 湖州市| 太谷县| 格尔木市| 林周县| 河池市| 六安市| 平山县| 永平县| 东海县| 山阳县| 武邑县| 龙南县| 简阳市| 文安县| 宝应县| 怀集县| 聂拉木县| 房山区| 朝阳区| 安吉县| 太湖县| 泰和县| 喀喇沁旗| 灯塔市| 桓台县| 繁昌县| 万安县| 林口县| 黑龙江省| 满城县| 阳泉市| 稻城县| 无为县|