做了一个星期的s3c6410,有很多弄懂得,也有很多没清楚的,感觉比较混乱,还是理一下思路。
0. 知识点
1. 视频解码的整个流程大致如下:
说明了视频文件解码的整个过程,而在做s3c6410硬件解码中,我们需要关注的是怎样把一个视频文件(avi/mkv/mp4)拿来,然后做demuxer变成raw video stream,接着就能输入到硬件中:
得到raw video后视频解码的整个过程,在编写过程中主要用到的API以及包含的文件如下图:
单纯的从raw video到播放比较简单,大部分的api都有了根据demo的程序改改,就可以基本解决了。
但还是有很多没搞定的:
1. 解复用demux这部分,我用ffmpeg来分流,avi格式的文件直接获取流以后,
while(av_read_frame(pFormatCtx, &packet) >= 0)
{
if(packet.stream_index == videoStream)
{}}
就可以一帧一帧的把他导入到另外一个文件中,然后就是可以播放的,但是ISO Media的就不行,mkv也不行。不知道是不是跟video container的格式有关。
2. 在硬件解码过程中,manual中说了,S3C6410 MFC codec支持两种模式的输入流(LINE_BUF和RING_BUF)。
LINE_BUF是the application needs to fill the input buffer with the video stream of the exact size of one frame.
RING_BUF是the application needs to fill the input buffer with the video stream of the size of PART. The size of PART is determined by the device driver.
但什么时候用RING_BUF什么时候用LINE_BUF我没弄明白。LINE_BUF, RING_BUF支持4种流解码的,而我在样例程序中使用的是LINE_BUF,测试的视频却是m4v, 264, rcv(上表中用ring_buf)。对这两个模式认识非常混乱。有待进一步研究。
感谢:http://qwdu.cublog.cn/
仔细看下MFC的那几个文档就可以了,文件封装的H264可能需要自己做demuxer,那个文档里面里面有提,ring buf模式支持文件封装的数据,我没测试,linebuf只支持标准的es流,我是用mplayer把文件demuxer出来的h264数据送到 linebuf模式的mfc,这样来测试的。
网络上取H264数据,是rtp/udp还是http?反正都是文件封装的问题,最好用基本的es 流,如果没有文件封装,那需要在本地解析组装NAL
在
ES流(Elementary Stream): 也叫基本码流,包含视频、音频或数据的连续码流.
PES流(Packet Elementary Stream): 也叫打包的基本码流, 是将基本的码流ES流根据需要分成长度不等的数据包, 并加上包头就形成了打包的基本码流PES流.
TS流(Transport Stream): 也叫传输流, 是由固定长度为188字节的包组成, 含有独立时基的一个或多个program, 一个program又可以包含多个视频、音频、和文字信息的ES流; 每个ES流会有不同的PID标示. 而又为了可以分析这些ES流, TS有一些固定的PID用来间隔发送program和ES流信息的表格: PAT和PMT表.
(在MPEG-2系统中,由视频, 音频的ES流和辅助数据复接生成的用于实际传输的标准信息流称为MPEG-2传送流)
封装 : 就是捆绑打包, 将画面视频文件和音轨文件打包在一起, 并按照一定规则建立排序和索引, 便于播放器或播放软件来索引播放. 包括AVI / PS(Program Stream)/ TS(Transport Stream)/ MKV(Matroska)等.