[問題] ffmpeg解h264的stream

看板Programming作者 (AM2)時間12年前 (2012/03/23 19:04), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/1
開發環境: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
文章代碼(AID): #1FR5YjDb (Programming)