-
當(dāng)前位置:首頁 > 創(chuàng)意學(xué)院 > 十大排名 > 專題列表 > 正文
2、MP4視頻無法播放,大概6分鐘左右,文件大小11M,用了itunes,暴風(fēng)影音,vlc以及windows media player。
3、用vs2010的c#調(diào)用vlc時(shí)出現(xiàn): PInvoke 簽名的調(diào)用約定和參數(shù)與非托管的目標(biāo)簽 名是否匹配。
ivlc十大排名(lc 排名)
大家好!今天讓創(chuàng)意嶺的小編來大家介紹下關(guān)于ivlc十大排名的問題,以下是小編對此問題的歸納整理,讓我們一起來看看吧。
創(chuàng)意嶺作為行業(yè)內(nèi)優(yōu)秀的企業(yè),服務(wù)客戶遍布全球各地,相關(guān)業(yè)務(wù)請撥打電話:175-8598-2043,或添加微信:1454722008
本文目錄:
一、vlc的pts是怎么計(jì)算的
H264的ES原始數(shù)據(jù)一般是以NAL(Network Abstract Layer)的格式存在??梢灾苯佑糜谖募鎯途W(wǎng)絡(luò)傳輸。每一個NALU(Network Abstract Layer Unit)數(shù)據(jù),是由數(shù)據(jù)頭+RBSP數(shù)據(jù)組成。
首先需要將數(shù)據(jù)流,分割成一個一個獨(dú)立的NALU數(shù)據(jù)。
接著獲取NALU的nal_type,i_nal_type的值等于0x7表示這個nalu是個sps數(shù)據(jù)包。找到并解析這個sps數(shù)據(jù)包,里面包含有非常重要的幀率信息
time_scale/num_units_in_tick=fps
然后根據(jù)nal_type判斷slice(H264中的slice類似一個幀F(xiàn)RAME的概念)。其中nal_type值小于0x1,或大于0x5,表示這個NALU屬于一個slice。
// 檢查是否是slice if ( i_nal_type < 1/*NAL_SLICE*/ || i_nal_type > 5/*NAL_SLICE_IDR*/ ) // 找到slice!!!!!
在找到slice的NALU后,可以逐字節(jié)將NALU的數(shù)據(jù)與0x80進(jìn)行與運(yùn)算,結(jié)果為真表示這個slice(幀F(xiàn)RAME)的結(jié)束位置。
// 判斷是否幀結(jié)束 for (uint32_t i = 3; i < nal_length; i++) { if (p_nal[i] 0x80) { // 找到frame_begin!!!!上一幀frame的結(jié)束,下一幀frame的開始 } }
上面的這個代碼是摘抄自FFMPEG。他實(shí)際作用是判斷slice里面的first_mb_in_slice,即第1個宏塊在slice中的位置,如果是
一幀開始,這個字段的值肯定是標(biāo)識第1個宏塊。因此,也可以完整解析slice的頭部信息,解析出first_mb_in_slice,如果是0(注意:
這是1個哥倫布數(shù)值),即這個NALU是一幀的開始。
為什么這里的代碼是逐字節(jié)判斷0x80?我額外寫點(diǎn)某大神的名言:程序猿不是十萬個為什么,不是維基猿,程序猿是需求猿。如果某程序猿已經(jīng)著手開始研究如何解析slice頭部格式,他很自然的不會有這個疑問。
另外通過nal_type以及silice_type也可以判斷出幀結(jié)束位置,VLC里面的代碼就是這么干。
解析到位于幀結(jié)束位置的NALU,就可以判斷出每一幀(slice)的開始和結(jié)尾。解析slice的slice_type,根據(jù)slice_type,可以判斷出這個slice的IPB類型。
// 根據(jù)slice類型判斷幀類型 switch(slice.i_slice_type) { case 2: case 7: case 4: case 9: *p_flags = 0x0002/*BLOCK_FLAG_TYPE_I*/; break; case 0: case 5: case 3: case 8: *p_flags = 0x0004/*BLOCK_FLAG_TYPE_P*/; break; case 1: case 6: *p_flags = 0x0008/*BLOCK_FLAG_TYPE_B*/; break; default: *p_flags = 0; break; }
從現(xiàn)在開始,就有兩種辦法來計(jì)算PTS了。
方法一、根據(jù)前后幀的IPB類型,可以得知幀的實(shí)際顯示順序,使用前面獲取的sps信息中的幀率,以及幀計(jì)數(shù)frame_count即可計(jì)算出PTS。此方法需要做幾幀緩存(一般緩存一個group的長度)。
I P B B I P B B I P B 幀類型
1 2 3 4 5 6 7 8 9 10 11 第幾幀
1 4 2 3 5 8 6 7 9 12 10 幀顯示順序
一個I幀與下一個I幀之間,是一個group。
從上圖可見,P類型的幀的顯示順序,是排在后面最后一個B幀之后。
所以要獲取第7幀的pts,起碼要知道他下一幀的類型,才能得知他的顯示順序。
第8幀的pts=1000(毫秒)*7(幀顯示順序)*幀率
方法二、每一個slice的信息里面,都記錄有pic_order_cnt_lsb,當(dāng)前幀在這個group中的顯示順序。通過這個pic_order_cnt_lsb,可以直接計(jì)算出當(dāng)前幀的PTS。此方法不需要做幀緩存。
計(jì)算公式:
pts=1000*(i_frame_counter + pic_order_cnt_lsb)*(time_scale/num_units_in_tick)
i_frame_counter是最近一次I幀位置的幀序,通過I幀計(jì)數(shù)+當(dāng)前group中的幀序,得到幀實(shí)際顯示序列位置,乘上幀率,再乘上1000(毫秒)的base_clock(基本時(shí)鐘頻率),得到PTS。
I P B B I P B B I P B 幀類型
1 2 3 4 5 6 7 8 9 10 11 第幾幀
1 4 2 3 5 8 6 7 9 12 10 幀顯示順序
0 6 2 4 0 6 2 4 0 6 2 pic_order_cnt_lsb
細(xì)心一點(diǎn)可以注意到,在上圖,slice里面的pic_order_cnt_lsb是以2進(jìn)行遞增。
通常H264里面的sps中記錄的幀率,也是實(shí)際幀率的2倍time_scale/num_units_in_tick=fps*2
因此,實(shí)際的計(jì)算公式應(yīng)該是這樣
pts=1000*(i_frame_counter*2+pic_order_cnt_lsb)* (time_scale/num_units_in_tick)
或者是
pts=1000*(i_frame_counter+pic_order_cnt_lsb/2)* (time_scale/num_units_in_tick/2)
所以,第11幀的pts應(yīng)該是這么計(jì)算
1000*(9*2+2)*(time_scale/num_units_in_tick)
二、MP4視頻無法播放,大概6分鐘左右,文件大小11M,用了itunes,暴風(fēng)影音,vlc以及windows media player。
暴風(fēng)影音是萬能播放器,它不能f播放了,就是說明這個文件損壞了。MP4格式就是MP4格式,沒有什么特殊格式。
三、用vs2010的c#調(diào)用vlc時(shí)出現(xiàn): PInvoke 簽名的調(diào)用約定和參數(shù)與非托管的目標(biāo)簽 名是否匹配。
[DllImport("libvlc.dll", EntryPoint = "libvlc_new", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
[SuppressUnmanagedCodeSecurity]
private static extern IntPtr libvlc_new(int argc, IntPtr argv);
改一下參數(shù)就好了
四、蘋果電腦,如果下載的歌曲是VLC的格式,怎樣才能把歌曲添加到iTunes里?
先轉(zhuǎn)換一下格式,然后再導(dǎo)入ITUNES
以上就是關(guān)于ivlc十大排名相關(guān)問題的回答。希望能幫到你,如有更多相關(guān)問題,您也可以聯(lián)系我們的客服進(jìn)行咨詢,客服也會為您講解更多精彩的知識和內(nèi)容。
推薦閱讀:
vivo手機(jī)一直反復(fù)優(yōu)化(vivo手機(jī)一直反復(fù)優(yōu)化怎么解決)
vivo手機(jī)價(jià)格排行榜(vivo手機(jī)價(jià)格排行榜2019)
網(wǎng)頁三列布局(網(wǎng)頁三列布局框架代碼)