FFmpeg采集摄像头图像并推流(RTSP/RTMP)---开发总结

我的一篇博文《如何用FFmpeg API采集摄像头视频和麦克风音频。。。》已经介绍了如何从视音频采集设备获取数据,并且编码、保存文件到本地。但是,有些应用并不是把流保存成文件,而是需要发送到网络的,比如现在很典型的一种应用场景:把流推送到RTSP、RTMP、HLS服务器,由服务器转发给其他用户观看。很多开发者也是调用FFmpeg API来实现推流的,用FFmpeg 做一个推流器很简单,调用流程跟输出文件的基本相同,基于前面博文的例子稍微修改就可以做出一个采集+编码+推流的软件。这里,我先假设读者已经会用FFmpeg API保存或录制文件,但没有实现过推流功能,我将给大家说一下做推流跟录制文件的区别,还有说一下要注意的几个问题,希望能帮助大家在开发推流功能时减少一些问题的出现。

首先,做推流和录制文件都需要调用到封装器对象的接口,我们需要定义一个封装器(或叫混合器):

AVFormatContext* m_outputAVFormatCxt;

创建封装器对象,根据输入的协议类型生成对应的封装器。

比如,对于RTSP,我们生成如下的推流封装器:

  res = avformat_alloc_output_context2(&m_outputAVFormatCxt, NULL, "rtsp", m_outputUrl.c_str());

对于RTMP,生成封装器的代码如下:

   res = avformat_alloc_output_context2(&m_outputAVFormatCxt, NULL, "flv", m_outputUrl.c_str());

其中,上面的m_outputUrl是推流地址。

然后,向封装器添加要发送的流(视频、音频),设置每个流的属性。假如我们要推送的流来源于一个文件,那就要先把文件的流枚举出来,获得每个流的信息,然后把这几个流“插入”到封装器里面,这样封装器才能识别这些流的格式。下面是从文件提取流的信息并添加到封装器的代码:

	AVOutputFormat* fmt = m_outputAVFormatCxt->oformat;

	//  fmt->video_codec = AV_CODEC_ID_H264;
	//	fmt->audio_codec = AV_CODEC_ID_AAC;

	for (int i = 0; i < m_inputAVFormatCxt->nb_streams; i++)
	{
		AVStream
  • 17
    点赞
  • 141
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值