真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

FFmpegnon-existingPPS0referenced問題描述

問題1)探測的碼流數(shù)據(jù)是否會進(jìn)行解碼顯示

從網(wǎng)站建設(shè)到定制行業(yè)解決方案,為提供成都做網(wǎng)站、成都網(wǎng)站建設(shè)服務(wù)體系,各種行業(yè)企業(yè)客戶提供網(wǎng)站建設(shè)解決方案,助力業(yè)務(wù)快速發(fā)展。創(chuàng)新互聯(lián)將不斷加快創(chuàng)新步伐,提供優(yōu)質(zhì)的建站服務(wù)。

AVFMT_FLAG_NOBUFFER宏定義剖析

默認(rèn)情況下,讀取的緩存數(shù)據(jù)將會用于解碼,如果不想探測的碼流用于顯示,可以這樣子設(shè)置:
pAVFormatContext->flags =pAVFormatContext->flags & AVFMT_FLAG_NOBUFFER;

代碼剖析
函數(shù)調(diào)用int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
??????? if (ic->flags & AVFMT_FLAG_NOBUFFER)
??????????? free_packet_buffer(&ic->packet_buffer, &ic->packet_buffer_end);

問題描述:因?yàn)闆]有設(shè)置該宏定義,傳遞進(jìn)去I幀數(shù)據(jù),應(yīng)該會被保存下來,但是明顯的得到PPS/SPS不存在的異常,究竟傳輸進(jìn)去的碼流哪里去了??

查看所有的函數(shù)引用
1)static int h364_slice_header_parse(const H264Context *h, H264SliceContext *sl, const H2645NAL *nal)

??? if (!h->ps.pps_list[sl->pps_id]) {
??????? av_log(h->avctx, AV_LOG_ERROR,
?????????????? "non-existing PPS %u referenced\n",
?????????????? sl->pps_id);
??????? return AVERROR_INVALIDDATA;
??? }
2)static inline int parse_nal_units(AVCodecParserContext *s, AVCodecContext *avctx, const uint8_t * const buf, int buf_size)

??????????? if (!p->ps.pps_list[pps_id]) {
??????????????? av_log(avctx, AV_LOG_ERROR,
?????????????????????? "non-existing PPS %u referenced\n", pps_id);
??????????????? goto fail;
??????????? }


avcodec_send_packet函數(shù)返回-1094995529錯(cuò)誤,根據(jù)FFmpeg的錯(cuò)誤信息,得知為AVERROR_INVALIDDATA,猜測是第一種情況
在調(diào)用h364_slice_header_parse函數(shù)的時(shí)候,出現(xiàn)了錯(cuò)誤,無法定位PPS

函數(shù)的調(diào)用邏輯
static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size)
?? ?int ff_h364_queue_decode_slice(H264Context *h, const H2645NAL *nal)
?? ??? ?static int h364_slice_header_parse(const H264Context *h, H264SliceContext *sl, const H2645NAL *nal)

結(jié)構(gòu)體的獲取
H264Context* pH264Context = AVCodecContext->priv_data
H264SliceContext *sl = H264Context->slice_ctx + H264Context->nb_slice_ctx_queued;

av_read_frame()讀取一個(gè)包并且把它保存到AVPacket結(jié)構(gòu)體中。這些數(shù)據(jù)可以在后面通過av_free_packet()來釋放。
函數(shù)avcodec_decode_video()把包轉(zhuǎn)換為幀。然而當(dāng)解碼一個(gè)包的時(shí)候,我們可能沒有得到我們需要的關(guān)于幀的信息。
因此,當(dāng)我們得到下一幀的時(shí)候,avcodec_decode_video()為我們設(shè)置了幀結(jié)束標(biāo)志frameFinished。

注意到相當(dāng)重要的一點(diǎn)av_read_frame()需要足夠的信息去解碼,如果沒有SPS/PPS,會繼續(xù)探測碼流,打印錯(cuò)誤如下:
I:2018-01-06 14:35:33 ms:313:nal_unit_type: 1, nal_ref_idc: 3
I:2018-01-06 14:35:33 ms:313:non-existing PPS 0 referenced
I:2018-01-06 14:35:33 ms:313:decode_slice_header error
I:2018-01-06 14:35:33 ms:313:no frame!





網(wǎng)上提供了一些方案,暫時(shí)沒有理解
1)1.確保第一個(gè)解碼的幀為I幀,確保I幀中有sps和pps信息
2)如果直接從rtsp流中一幀一幀的取,再一幀一幀的轉(zhuǎn)碼yuv,對AVpacket,AVframe沒有特殊要求,完整就好。
3) 若果現(xiàn)將h364實(shí)時(shí)流存在共享內(nèi)存中,再從共享內(nèi)存中讀取一幀的AVpacket,那么AVframe就不要循環(huán)清理,最好做成成員變量,否則非關(guān)鍵幀無法解碼,會提示如上錯(cuò)誤。
解決辦法:將AVframe做成成員變量,不能用一次清理一次


當(dāng)前題目:FFmpegnon-existingPPS0referenced問題描述
文章URL:http://weahome.cn/article/pediec.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部