在经过差不多一个礼拜的时间,终于完成了RTSP+H.264解码,真的是十分的高兴,期间感冒,身体不好,还和XX闹矛盾,因此做出来也有点出乎意料,心情格外的好。终于能毕业了。
因此分享一下我的经验,希望对大家有所帮助。
工作流程:1 RTSP客户端搭建
2 使用VLC流测试RTSP
3 RTP接收线程的框架
4 主线程用于绘图的框架
5 FFMPEG的移植
6 FFMPEG的包裹文件与调用类
7 整合NAL Unit,传递给解码类
详细介绍:
关于1,主要就是使用JRTSPLIB,开源项目,我之前写过关于移植的一些改动。
关于2,VLC流输出可以使用流输出字符串简化操作:
sout=#transcode{venc=x264{profile=baseline},vcodec=h264,vb=300,fps=15,scale=1.25,width=176,height=144,acodec=none}:rtp{sdp=rtsp://:8086/} :sout-keep
关于3,可以参照sipdroid的rtp封装
关于4,surfaceview、bitmap、canvas
关于5,参照我之前的几篇文章
关于6,给出我参考的几个对我帮助非常大的帖子:
手研网:http://www.shouyanwang.org/thread-1753-1-1.html
某国外论坛(原链接失效,补上自己的笔记):http://www.evernote.com/shard/s41/sh/08ba8a04-86bc-48ff-873f-ca9bcd100683/e542fe558661f87987e40d8ccf70d149
手研网的这篇介绍了编译与移植FFMPEG,并且给出了简单的wrapper,可以先按照那个练习一下,但是不推荐使用他的编译与移植方法,没有动态链接来得好
博客园的那篇给出了jni源文件,是一个非常好的学习材料,提取了解码需要的ffmpeg源文件,但是对于流解码,我没有成功。
后来我决定自己写包裹文件,第三个链接,给与我很大的帮助,基本我就是按照那个写的。
关于7,相当重要,我是将SPS,PPS,I帧一起给avcodec_decode_video2的,对于FU-A分片,需要提取UnitType,将每个分包都组成一个完整的Slice,再解码,这是我之前失败的重要原因!
如果有问题,欢迎大家留言,相信大家做出来之后也会和我有一样的成就感
关于FFMPEG移植的代码以及包裹类代码,已经在google code开源:
http://code.google.com/p/droidffmpeg/