作者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
※ SocketAM2:转录至看板 C_and_CPP 03/23 22:35