Fw: [問題] ffmpeg解h264的stream

看板C_and_CPP作者 (AM2)時間13年前 (2012/03/23 22:35), 編輯推噓4(406)
留言10則, 4人參與, 最新討論串1/3 (看更多)
※ [本文轉錄自 Programming 看板 #1FR5YjDb ] 作者: SocketAM2 (AM2) 看板: Programming 標題: [問題] ffmpeg解h264的stream 時間: Fri Mar 23 19:04:11 2012 開發環境: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 ※ 發信站: 批踢踢實業坊(ptt.cc) ※ 轉錄者: SocketAM2 (123.192.25.86), 時間: 03/23/2012 22:35:47

03/23 23:59, , 1F
施主您好 若將這些 研究好 不就是您的不可取代之處嗎
03/23 23:59, 1F
ㄜ...其實我沒把自己想的那麼偉大,就是想知道去哪可以學到這些而已

03/23 23:59, , 2F
其實 這應該去國外網站問 會比較有答案
03/23 23:59, 2F
請問有推薦的網站或論壇嗎,我去估狗

03/24 00:01, , 3F
SPS PPS 會有你要的資訊 width/height
03/24 00:01, 3F
我要的資訊不是長寬,這都有了 我要的是存著解好YUV的array的排列方式,我要直接access每個pixel ※ 編輯: SocketAM2 來自: 123.192.25.86 (03/24 00:14)

03/24 00:22, , 4F
印象中都是 yuv420p,先存 y plane 再來才是 uv planes
03/24 00:22, 4F

03/24 00:23, , 5F
RGB是直接一個 pixel 三個 channel 排在一起
03/24 00:23, 5F
我知道YUV420P、YV12等等等結構的擺放方式 我想知道的是avcodec_decode_video2()解出存在AVFrame pFrame裡的結構 根據查到的資料和實際檢視,有些我弄不懂的padding之類 我希望藉由直接存取pFrame取出我需要的pixel資訊 所以發問請教有沒有人知道那裏面的資訊是如何擺放的 ※ 編輯: SocketAM2 來自: 123.192.25.86 (03/24 00:43)

03/24 02:39, , 6F
發到他的 mail list 上去問吧 這部分沒有文件
03/24 02:39, 6F

03/24 02:42, , 7F
或者翻翻看 libcodec/h264.h , h264.c ?
03/24 02:42, 7F

03/25 07:09, , 8F
去 StackOverFlow 問看看吧
03/25 07:09, 8F

03/25 07:11, , 9F
你的問題在於大家不知道你要問什麼 got_picture 會傳回什麼
03/25 07:11, 9F

03/25 15:12, , 10F
用avpicture_layout()? 或者直接跳過每行padding 32BYTE
03/25 15:12, 10F
文章代碼(AID): #1FR8f40- (C_and_CPP)
文章代碼(AID): #1FR8f40- (C_and_CPP)