方法

ffmpeg中av_open_input_file()这个函数可以直接打开rtsp流,av_write_frame()可以把数据写到文件。
如果只是采集视频流的话,关键的是两个函数,一个是avformat_open_input,通过URL打开视频流,一个是av_read_frame读取视频流每一帧。

live555提供了两个demo ,一个是openRTSP,另一个是testRTSPClient
可以看这里: http://blog.chinaunix.net/uid-15063109-id-4482932.html
保存成bmp或jpg看这个:http://blog.chinaunix.net/uid-15063109-id-4275143.html
当然ffmpeg也可以,参考ffplay代码就行了。只是ffplay延时比直接用live长一些。

FFmpeg的使用

代码来自FFmpeg 获取RTSP传过来的视频数据并保存成文件

  • 缺少libavutil/avconfig.h头文件

自己写一个放在libavutil文件夹里。内容如下:

  1. /* Generated by ffconf */
  2. #ifndef AVUTIL_AVCONFIG_H
  3. #define AVUTIL_AVCONFIG_H
  4. #define AV_HAVE_BIGENDIAN 0
  5. #define AV_HAVE_FAST_UNALIGNED 0
  6. #endif /* AVUTIL_AVCONFIG_H */
  • avstream::codec 被声明为已否决

定位错误代码:

  1. if (pFormatCtx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
  2. {
  3. videoindex = i;
  4. break;
  5. }

AVStream的codec成员不再推荐使用,替换为codecpar
从而我们知道FFmpeg中所谓的“被声明为已否决”就是因为函数或者结构体属性被标示为attribute_deprecated,很有可能在未来的版本中就删除了。
所以我们最好的解决方案就是使用新的被推荐使用的函数、结构体等。

  • av_register_all 被声明为已否决

新的ffmpeg库不需要集中初始化的组建。
旧的接口:av_register_all();
去掉av_register_all()这句即可。

  • 错误 LNK2019 9个无法解析的外部命令

是FFmpeg的使用方法错了,ffmpeg官网有static、dev和shared三个版本,后两个也都要下载,是项目中必不可少的库文件。
(这个问题花了3小时都没解决,博客教的属性配置方法没有错,但谁知道原来是我的ffmpeg没有下载全呢。之前看安装教程说只要下载static版本就可以了,那些写ffmpeg项目的博客里也没有说要用后两个版本的。)

  • 警告 C4326 “main”的返回类型应为“int”而非“void”

我写的是 void main(){…}
改成int main(int argc, char* argv[]){…}