RECORDING MY FANTASY

Sunday, September 09, 2007

要开始找工作了....

时间过的真快,转眼就九月份了。一个暑假的时间已经无影无踪了。

好像突然间,校园招聘就开始了,各大bbs上开始了火热的“广告”,什么 微软阿, 百度阿, 腾讯阿,一股脑儿全开始了。
赶紧修改修改简历,使劲往外投。

Wednesday, September 05, 2007

截取rtsp视频流的某一刻的图片

darwin流媒体服务器,来提供rtsp的视频流。
现在在某一时刻截取其rtsp流中的一帧图像,保存为想要的格式,比如bmp,jpg等等。
想来解决这个问题的方式比较简单,就是: 打开rtsp视频流;--》截取图像——》保存图像。这样一个流程而已。
涉及到的知识包括流媒体,mpeg4,rtsp协议。图像处理。

我以前也就上课的时候接触图像处理,视频编解码方面的基础知识。水平实在是有限,所以在解决这个问题的时候首先想到的就是利用现成的工具。
通过请教别人+google,知道ffmpeg可以达到这方面的要求,心里非常高兴。安装ffmpeg,按照网上所贴的参数运行:
./ffmpeg -i rtsp://192.168.2.17:554/sample_100kbit.mp4 -y -f image2 -t 0.001 test.jpg
结果没有反应。但是,ffmpeg在处理本地文件的时候可以截取出需要的图片。可以看出,问题处在了ffmpeg对rtsp的支持上。没办法,下源代码,编译,调试。发现,在libavformat/rtsp.c文件中,当程序执行到rtsp_send_cmd,开始播放的时候(这个地方记不太请了-_-!), 出现了一个奇怪的错误,系统提示: Bind: Address Already in Use
当时,用ddd调试的,有好多调试命令不会用,只用基本的调试手段。所以,没能查出最后是什么问题。google上也没找着,很是让人郁闷。

然后,只好先转向其他的视频处理的lib库了,找着一个livemedia(www.live555.com)的开源库,vlc中有它的应用。它是一个完全面向对象设计的库。我用C语言比较多,看C程序比较习惯。现在一下子开始看C++的库,很是发怵。还好,代码里面有一些testProgs,第一个就是openRTSP,它可以打开一个rtsp协议的视频流,将视频和音频分别保存。我试着用了一下,能够成功的解出视频流,并且保存为可以播放的本地文件。

看起来,livemedia的库很不错。
不过,首先得了解整个架构,参照实例程序,才有可能实现自己的东西。我google出来一篇中文的文章,利用Livemedia做二次开发的,
LiveMedia库总结
还有这个:在Livemedia的基础上开发自己的流媒体客户端 V 0.01

然后我参照openRTSP的程序,只截取RTSP流的视频部分,并且保存为一个本地文件。接着,需要完成的工作就是能够将mpeg4的一帧截取出来,保存为图片。根据我粗浅的了解,它的帧应该是yuv格式的,需要将它转换成其他格式的,比如yuv->bmp,再转其他的也不难了。现在做到这一步了,

livemedia的库中有一个类 MPEG4VideoStreamParser,它用来解析mpeg4视频流,但是我的mpeg4的知识太 有限了,好多基本概念都不是太清楚。现在还不知道怎么利用它来完成我想要的功能。
---一个想法,是不是可以实现一个新的类,继承自MPEG4VideoStreamParser,增加处理图像的功能?
试一下再说吧!