[問題] ffmpeg解h264的stream
開發環境:VC2008、ffmpeg的SDK
關於h264的Raw Byte Sequence Payload小弟已經有相當程度的熟悉
ffmpeg中用到的AVpacket、AVframe等等的初始化也都沒問題
現在剩下的問題有兩個,
都是關於AVPacket avpkt裡面的data要餵進那些nal unit的byte,
才能在丟入ffmpeg中用來decode的函數avcodec_decode_video2()後正確解碼
我嘗試把一段h264 raw stream中一段(HEX)
00 00 00 01 09 ......(這是一段delimiter,pic_type: I-frame)
00 00 00 01 27 ......(這是一段SPS)
00 00 00 01 28 ......(這是一段PPS)
[00 00 00 01 06 ......] * 3 (連續三段SEI)
00 00 00 01 05 ......(這是I-frame的內容)
餵進avpkt.data,並把這段的總長(byte)丟進avpkt.size
結果avcodec_decode_video2()有回傳非零的值,但卻沒有got_picture
嘗試連續做上一段的事情兩次,
則在第二次回傳非零的值,並且有got_picture
請問第一個問題:是否第一次把SPS、PPS丟入avcodec_decode_video2()時,
這些parameter set的內容並無法使用在丟進去的當下這個AVPacket,
這第一次丟入avcodec_decode_video2()實際上相當於告知解碼器解碼的參數,
而在第二次的時候才能順利解碼並且got_picture?
有大大可以詳細點的說明avcodec_decode_video2()的使用方法嗎?
http://ffmpeg.org/上面的說明雖然幫助很大,但許多細節都沒提到......
=========================================================================
第二個問題:
avcodec_decode_video2()成功解碼,把畫面存在AVFrame pFrame裡面之後,
若我想要把這個解好的畫面"長寬大小不變"的依據Y、U、V取出存在另一塊記憶體中,
我需要知道這個解完的frame的編碼方式(YUV420、422或其他等等)
和在AVFrame pFrame中存放排列的方法,
請問有人知道要怎麼獲取這段解好的原始資料嗎?
現在暫時可行的做法是使用sws_scale(),因為它的output是我知道排列方式的。
但我擔心即使是透過sws_scale()做"原尺寸、原編碼方式"的輸出,
實際上仍然需要相當的計算effort,
也就是這一步造成了多於計算資源的浪費。
小弟希望在有限的電腦上盡可能的快速處理大量高解析度影像,
故對效率性希望能做一些提高。
--
小弟這部分完全是上網找資料自學,也許有些觀念其實存在謬誤也請不吝指點
另外,現在要去吃個飯,晚上回來一定會回應,
若有大大作回覆的,或是認為我還需要補充說明什麼的
請不要一小時內沒看我回應就誤解小弟發問誠意不足丟了就跑,實在是吃飯時間......
總之請各位先進不吝指教,謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 202.39.60.73
※ SocketAM2:轉錄至看板 C_and_CPP 03/23 22:35
Programming 近期熱門文章
PTT數位生活區 即時熱門文章