您好,登錄后才能下訂單哦!
問題描述
設(shè)置該標(biāo)志位,在解碼過程中似乎并沒有任何的效果,本意是通過設(shè)置該標(biāo)志位AV_CODEC_FLAG_GLOBAL_HEADER
通過AVCodecContext在解碼過程中,從extradata中讀取SPS/PPS,然后將信息填充到每一幀之前,然后正確解碼
變量說明
/**
* Place global headers in extradata instead of every keyframe.
*將全局頭部信息放在extradata指針中,而不是每一個(gè)關(guān)鍵幀中
*/
#define AV_CODEC_FLAG_GLOBAL_HEADER (1 << 22)
1)libx264.c:static av_cold int X264_init(AVCodecContext *avctx)
該變量主要出現(xiàn)在該函數(shù)的以下兩個(gè)地方
1 if (avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER)
x4->params.b_repeat_headers = 0;
說明
b_repeat_headers的意思是將SPS/PPS添加到每一個(gè)關(guān)鍵幀之前,0代表不添加
如果設(shè)置了videosteam 的codec中設(shè)置了AV_CODEC_FLAG_GLOBAL_HEADER就會(huì)導(dǎo)致x264_param_t參數(shù)中的b_repeat_header賦值為0,
這樣每個(gè)關(guān)鍵幀前面就不會(huì)添加SPS/PPS,如果在探測(cè)碼流的時(shí)候,無法獲取正確的SPS/PPS,就會(huì)導(dǎo)致解碼失敗。
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;
}
相關(guān)信息說明
1)http://www.cnblogs.com/wanggang123/p/6128719.html指出如果要求打開編碼器之后
AVCodecContext extradata存有 SPS,PPS 信息需要加上如下代碼
AVCodecContext->flags |= AV_CODEC_FLAG_GLOBAL_HEADER
暫時(shí)用不上,因?yàn)楫?dāng)前是解碼,默認(rèn)情況下AVCodecContext extradata在探測(cè)碼流(avformat_find_stream_info)
會(huì)自動(dòng)將SPS,PPS填充到extradata字符串中,通過avcodec_parameters_to_context函數(shù),將codecpar內(nèi)容
傳遞給AVCodecContext
2)http://blog.csdn.net/ET_Endeavoring/article/details/77949850指出需要對(duì)AVCodecContext結(jié)構(gòu)體進(jìn)行如下的設(shè)置
AVCodecContext->flags |= AV_CODEC_FLAG_GLOBAL_HEADER
FFmpeg才會(huì)在調(diào)用avcodec_open2函數(shù)里面,將SPS,PPS信息寫入header
如下代碼提供手動(dòng)填充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);
實(shí)際上,在解碼的時(shí)候,手動(dòng)填充無效
3)http://blog.csdn.net/passionkk/article/details/75528653指出了在實(shí)時(shí)視頻傳輸時(shí),需要發(fā)送
SPS/PPS數(shù)據(jù),必須設(shè)置
param.b_repeat_headers = 1; // 重復(fù)SPS/PPS放到關(guān)鍵幀前面
種種情況下,codec中不能設(shè)置AV_CODEC_FLAG_GLOBAL_HEADER標(biāo)志,從上面的代碼,就可以知道
如果設(shè)置了videosteam 的codec中設(shè)置了AV_CODEC_FLAG_GLOBAL_HEADER就會(huì)導(dǎo)致x264_param_t參數(shù)中的b_repeat_header賦值為0,
這樣每個(gè)關(guān)鍵幀前面就不會(huì)添加SPS/PPS,如果在探測(cè)碼流的時(shí)候,無法獲取正確的SPS/PPS,就會(huì)導(dǎo)致解碼失敗。
0x00000001或者0x000001是起始碼,0x67是sps的開頭,0x68是pps的開頭。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。