关键帧 关于decode_one_frame函数
田克平(94338047) 16:57:34
能自己設(shè)置某幀為關(guān)鍵幀嗎?
抱柱者(86311414) 16:57:59
to 田克平
可以
田克平(94338047) 17:00:00
呵呵,把丟包后的下一幀設(shè)置為I幀可以嗎?來(lái)處理丟幀現(xiàn)象
☆雪天/kf☆(279373002) 17:00:42
這個(gè)難度大了
田克平(94338047) 17:01:15
難度在哪?
抱柱者(86311414) 17:01:53
如果1to1那應(yīng)該可行,但是要是傳到多點(diǎn)那可能比較麻煩
田克平(94338047) 17:03:54
謝謝
抱柱者(86311414) 17:04:05
比如傳至A、B兩點(diǎn),到A的丟包很少,而到B丟包較多,那A也要因?yàn)锽點(diǎn)而經(jīng)常接受關(guān)鍵幀
抱柱者(86311414) 17:04:29
不過(guò)你也可以現(xiàn)象折中的方法
抱柱者(86311414) 17:04:38
不過(guò)你也可以想想折中的方法
田克平(94338047) 17:04:48
就1to1的話、、、
田克平(94338047) 17:05:11
怎么做
抱柱者(86311414) 17:05:22
就像你說(shuō)的做啊
抱柱者(86311414) 17:05:50
丟包了就通知編碼端,下一幀編為關(guān)鍵幀
田克平(94338047) 17:06:07
好的,謝謝
☆雪天/kf☆(279373002) 17:06:16
田克平(94338047) 17:00:00
呵呵,把丟包后的下一幀設(shè)置為I幀可以嗎?來(lái)處理丟幀現(xiàn)象
編碼的時(shí)候你怎么會(huì)知道哪一幀會(huì)丟?
☆雪天/kf☆(279373002) 17:07:55
除非你有反饋通道
抱柱者(86311414) 17:08:58
肯定是反饋啊,正常可能是丟包了就通知編碼端重發(fā),現(xiàn)在改為通知編碼端設(shè)置關(guān)鍵幀
傻子更聰明(120928606) 17:09:43
這樣好象實(shí)時(shí)性比較差啊,也難免不會(huì)再被丟。
呵呵(369873095) 17:10:11
網(wǎng)絡(luò)的來(lái)回時(shí)間考慮了嗎(RTT)
☆雪天/kf☆(279373002) 17:10:15
這樣效率很低呀
☆雪天/kf☆(279373002) 17:10:25
你編碼器一直要等在那里
抱柱者(86311414) 17:11:07
他是設(shè)置下一幀為關(guān)鍵幀,而不是處理丟了的那一幀,所以實(shí)時(shí)性應(yīng)該沒(méi)有問(wèn)題
田克平(94338047) 17:11:09
丟包了不通知嗎
☆雪天/kf☆(279373002) 17:11:21
兩次傳輸路徑時(shí)間+解碼器處理時(shí)間 編碼器無(wú)法并行
☆雪天/kf☆(279373002) 17:12:25
就是說(shuō)你反饋回來(lái)的時(shí)候 編碼器已經(jīng)編到后面去了 丟的哪一幀后面的一幀 早編完了
抱柱者(86311414) 17:12:57
編碼器為什么要等?
編碼器就按正常的編碼,如果解碼器反饋丟包了,應(yīng)用程序就修改編碼參數(shù)設(shè)置關(guān)鍵幀,與并行扯不上關(guān)系
田克平(94338047) 17:12:58
好像是這樣啊
傻子更聰明(120928606) 17:14:09
網(wǎng)絡(luò)UDP不可靠傳輸,多少秒來(lái)一個(gè)關(guān)鍵幀比較合適?
抱柱者(86311414) 17:14:16
為什么要局限于下一幀,下兩幀也沒(méi)關(guān)系啊
抱柱者(86311414) 17:14:35
反正只是要盡快出現(xiàn)一個(gè)關(guān)鍵幀就行了
☆雪天/kf☆(279373002) 17:15:13
你說(shuō)的沒(méi)錯(cuò) 但是一個(gè)反饋的時(shí)間編碼器可能已經(jīng)編碼了好多幀了
☆雪天/kf☆(279373002) 17:15:56
所以只能說(shuō)是一接到反饋就立即置I幀
☆雪天/kf☆(279373002) 17:22:06
可以結(jié)合周期插入I幀一起來(lái)用 周期可以大一點(diǎn)
田克平(94338047) 17:23:10
關(guān)鍵幀間隔是定好的、、、
抱柱者(86311414) 17:23:15
肯定是會(huì)有固定關(guān)鍵幀周期的
傻子更聰明(120928606) 17:23:48
這種方法是在關(guān)鍵幀間隔比較大的情況下可以用。
田克平(94338047) 17:24:42
2s間隔有什么問(wèn)題
傻子更聰明(120928606) 17:25:06
而且非關(guān)鍵幀丟失后怎么處理?會(huì)有花屏之類的。
傻子更聰明(120928606) 17:25:39
把導(dǎo)致花屏的幀丟掉后,圖象會(huì)有停頓。
田克平(94338047) 17:25:52
間隔很小的話當(dāng)然是作用不大
☆雪天/kf☆(279373002) 17:25:58
那也沒(méi)有辦法 只能跳到下一個(gè)I幀
呵呵(369873095) 17:26:24
在碼率大的時(shí)候,一幀的數(shù)據(jù)都是由幾十個(gè)包承載的,多個(gè)包里掉一個(gè)包(幾個(gè)包)是否反饋要求I幀
☆雪天/kf☆(279373002) 17:27:21
那倒不用 使用EC足夠應(yīng)付了
傻子更聰明(120928606) 17:27:22
網(wǎng)絡(luò)傳輸應(yīng)該不用I幀吧?把I幀全變?yōu)镮DR幀,這樣才有意義。
sunj(39310543) 17:28:42
這個(gè)問(wèn)題有rfc來(lái)定義的
傻子更聰明(120928606) 17:28:42
錯(cuò)誤掩藏,解碼器不支持的話,怎么整。也需要編碼器支持吧?。
sunj(39310543) 17:28:52
消息已經(jīng)標(biāo)準(zhǔn)化了
☆雪天/kf☆(279373002) 17:29:34
簡(jiǎn)單的塊copy就可以搞定這個(gè)了 不需要編碼器做什么
傻子更聰明(120928606) 17:31:12
這樣子,也是會(huì)引起連續(xù)的失真。。
☆雪天/kf☆(279373002) 17:22:06
可以結(jié)合周期插入I幀一起來(lái)用 周期可以大一點(diǎn)
田克平(94338047) 17:23:10
關(guān)鍵幀間隔是定好的、、、
抱柱者(86311414) 17:23:15
肯定是會(huì)有固定關(guān)鍵幀周期的
傻子更聰明(120928606) 17:23:48
這種方法是在關(guān)鍵幀間隔比較大的情況下可以用。
田克平(94338047) 17:24:42
2s間隔有什么問(wèn)題
傻子更聰明(120928606) 17:25:06
而且非關(guān)鍵幀丟失后怎么處理?會(huì)有花屏之類的。
傻子更聰明(120928606) 17:25:39
把導(dǎo)致花屏的幀丟掉后,圖象會(huì)有停頓。
田克平(94338047) 17:25:52
間隔很小的話當(dāng)然是作用不大
☆雪天/kf☆(279373002) 17:25:58
那也沒(méi)有辦法 只能跳到下一個(gè)I幀
呵呵(369873095) 17:26:24
在碼率大的時(shí)候,一幀的數(shù)據(jù)都是由幾十個(gè)包承載的,多個(gè)包里掉一個(gè)包(幾個(gè)包)是否反饋要求I幀
☆雪天/kf☆(279373002) 17:27:21
那倒不用 使用EC足夠應(yīng)付了
傻子更聰明(120928606) 17:27:22
網(wǎng)絡(luò)傳輸應(yīng)該不用I幀吧?把I幀全變?yōu)镮DR幀,這樣才有意義。
sunj(39310543) 17:28:42
這個(gè)問(wèn)題有rfc來(lái)定義的
傻子更聰明(120928606) 17:28:42
錯(cuò)誤掩藏,解碼器不支持的話,怎么整。也需要編碼器支持吧?。
sunj(39310543) 17:28:52
消息已經(jīng)標(biāo)準(zhǔn)化了
☆雪天/kf☆(279373002) 17:29:34
簡(jiǎn)單的塊copy就可以搞定這個(gè)了 不需要編碼器做什么
傻子更聰明(120928606) 17:31:12
這樣子,也是會(huì)引起連續(xù)的失真。。
?
?
main()
{
...
???? while (decode_one_frame(img, input, snr) != EOS);
...
}
然后在decode_one_frame()
{
???? ...
??? currSlice->next_header = -8888;
??? .....
???? while ((currSlice->next_header != EOS && currSlice->next_header != SOP))
???? {
??????????? current_header = read_new_slice();
??????????? if (current_header == EOS)
??????????? {
????????????????? exit_picture();
????????????????? return EOS;
???????????? }
??????????? decode_slice(img, inp, current_header);
???????????????? ...
?????? }
???? ...
???? exit_picture();
???? return (SOP);
}
按照上面的代碼,經(jīng)過(guò)跟蹤發(fā)現(xiàn),currSlice->next_header 一直不變,那么decode_one_frame()中的while循環(huán)永遠(yuǎn)不會(huì)因?yàn)闂l件的不滿足而跳出循環(huán),只會(huì)因?yàn)閏urrent_header == EOS條件的滿足而推出該函數(shù)。
因此 decode_one_frame()函數(shù)只可能返回EOS,而不會(huì)是SOP;那么main()中的while循環(huán)將只會(huì)執(zhí)行一次。而且在代碼跟蹤的過(guò)程中發(fā)現(xiàn),輸入碼流的所有序列是在decode_one_frame()函數(shù)中全部解出,然后才推出該函數(shù)。
請(qǐng)教各位,jm為什么要這樣呢?還是我什么地方?jīng)]注意到?謝謝了
A:再次仔細(xì)跟蹤了一下代碼發(fā)現(xiàn),jm整個(gè)解碼的結(jié)構(gòu)是這樣的:
1。在main中調(diào)用while (decode_one_frame(img, input, snr) != EOS);
但實(shí)際上,這個(gè)while只會(huì)循環(huán)一次,因?yàn)閐ecode_one_frame()只可能返回EOS(下面講為什么?)
2。在decode_one_frame()中通過(guò)調(diào)用
??? while ((currSlice->next_header != EOS && currSlice->next_header != SOP))
??? {
?? ?? ?? current_header = read_new_slice();
?? ?? ?? if (current_header == EOS)
?? ?? ?? {
?? ?? ?? ?? ?? exit_picture();
?? ?? ?? ?? ?? return EOS;
?? ?? ?? }
?? ?? ?? decode_slice(img, inp, current_header);
?? ?? ?? ?? ??? ...
?? }
解碼所有幀。如上所述,currSlice->next_header根本沒(méi)有起到任何作用,因?yàn)闆](méi)有其他地方為 其賦值,為什么呢?
因?yàn)槿绻胫纍ext_header必須要將下一個(gè)slice碼流讀進(jìn)來(lái),再進(jìn)行解析,既然已經(jīng)讀進(jìn)來(lái),不管判斷的是一個(gè)新的pic,還是同一個(gè)pic中的新的slice,都必須立刻進(jìn)行解碼,也就沒(méi)有必要再回到main()中的while循環(huán)了。
實(shí)際上起作用的是current_header,即通過(guò)read_new_slice()來(lái)獲得,(sop or sos):
?? ??? if(is_new_picture())
?? ??? {
?? ?? init_picture(img, input);
?? ?? current_header = SOP;//start of pic
?? ??? }
?? ??? else
?? ?? current_header = SOS;//start of slice
如果current_header=sop,那么將會(huì)調(diào)用init_picture(),這個(gè)函數(shù)主要實(shí)現(xiàn)兩個(gè)功能:首先,通過(guò)exit_picture()把上一次解碼的圖像及相關(guān)信息進(jìn)行保存等處理 然后,再為當(dāng)前slice(新的一幀)的解碼做好準(zhǔn)備。如果current_header=sos,那么將不會(huì)調(diào)用init_picture(),直接利用當(dāng)前pic的準(zhǔn)備信息進(jìn)行解碼。如果在read_new_slice()中發(fā)現(xiàn)已經(jīng)到碼流的結(jié)尾了,那么將返回EOS.
這時(shí)在decode_one_frame()中,一旦current_header==EOS,那么將退出解碼,返回到main()中來(lái)。值得注意的是,返回之前,它還是調(diào)用了exit_picture(),從而將最后一個(gè)解碼幀進(jìn)行保存。
大概流程應(yīng)該就是這樣,如果有漏掉或錯(cuò)誤的地方還請(qǐng)高手補(bǔ)充指正。總之jm中的有些函數(shù)的內(nèi)容并不一定與其函數(shù)名稱相吻合,這可能也是他們開(kāi)發(fā)到后期沒(méi)有辦法的事情。不知道x264或其他的解碼器是不是如此復(fù)雜?
總結(jié)
以上是生活随笔為你收集整理的关键帧 关于decode_one_frame函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 安卓案例:利用SQLiteOpenHel
- 下一篇: java获取实体类的属性和值