ffmpeg 接受socket数据为数据源

本文介绍了如何利用ffmpeg实现从自定义的socket数据源中读取数据并进行解码播放。通过av_register_all()初始化,av_open_input_file()打开数据源,av_find_stream_info()获取流信息,avcodec_find_decoder()寻找解码器,avcodec_open()打开解码器,av_read_frame()读取数据包,avcodec_decode_video()解码视频帧,并转换格式保存。最后,通过创建自定义的AVIOContext并配置ffmpeg的输入流,实现了从socket接收数据并进行处理。
摘要由CSDN通过智能技术生成

用ffmpeg写过一个自己的播放器,对ffmpeg如何打开打开文件,匹配demux,提取stream,匹配decode及渲染有一个感性的认识,目前想做一个网络接口支持多路远程摄像头的播放,起初的解决方案是dshow打开摄像头+x264编码+live555(RSTP)传输,发现编码速度太慢,达不到实时要求,于是将编码改成多线程,发现速度没什么提升(可能是拿出了问题吧)后来想起了ffmpeg(强悍的东东)于是暂停原来的方案,再次研究ffmpeg;这次的重点是配置io即用从自己设定的io中读取数据,想直接用socket发送编码数据,然后在客户端进行数据整合,传输到ffmpeg里进行解码输出;通常我们是按照下列步骤进行解码的:

 1打开视频文件:
首先第一件事情--让我们来看看怎样打开一个视频文件并从中得到流。我们要做的第一件事情就是初始化libavformat/libavcodec:

av_register_all();

这一步注册库中含有的所有可用的文件格式和编码器,这样当打开一个文件时,它们才能够自动选择相应的文件格式和编码器。要注意你只需调用一次 av_register_all(),所以,尽可能的在你的初始代码中使用它。如果你愿意,你可以仅仅注册个人的文件格式和编码,不过,通常你不得不这么做却没有什么原因。

2
下一步,打开文件:
AVFormatContext *pFormatCtx;
const char    *filename="myvideo.mpg";
// 打开视频文件

if(av_open_input_file(&pFormatCtx,filename, NULL, 0, NULL)!=0)
       handle_error(); //
不能打开此文件


最后三个参数描述了文件格式,缓冲区大小(size)和格式参数;我们通过简单地指明NULL或0告诉 libavformat去自动探测文件格式并且使用默认的缓冲区大小。请在你的程序中用合适的出错处理函数替换掉handle_error()。


3下一步,我们需要取出包含在文件中的流信息:
// 取出流信息
if(av_find_stream_info(pFormatCtx)<0)
     handle_error(); //
不能够找到流信息

这一步会用有效的信息把 AVFormatContext 的流域(streams field)填满。作为一个可调试的诊断,我们会将这些信息全盘输出到标准错误输出中,不过你在一个应用程序的产品中并不用这么做:
dump_format(pFormatCtx, 0, filename, false);

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值