【音视频】使用FFMPEG读取本地|网络音视频流(3-4)

本文详细介绍了如何使用FFMPEG读取本地和网络音视频流,包括初始化源、启动和停止采集线程,以及写入本地文件或发送网络流的操作。在启动采集线程时需注意控制帧率,避免对媒体流服务器造成压力。同时,文章还讨论了调整PTS|DTS的重要性,以确保正确播放。
摘要由CSDN通过智能技术生成

前言:继上一篇推送网络流之后,最近又研究了一下读取网络流(顺便还有本地流)作为音视频源,此篇作为记录。

一、本地|网络视频源

1、初始化视频源

int VStreamCaptor::init(const std::string& url, const int fps)
{
   
	int err = ERROR_CODE_OK;
	if (m_inited) {
   
		return err;
	}

	do {
   
		m_deviceId = url;

		err = initStream();
		if (err != ERROR_CODE_OK) {
   
			break;
		}

		m_fps = m_formatCtx->streams[m_streamIndex]->r_frame_rate.num / m_formatCtx->streams[m_streamIndex]->r_frame_rate.den;
		m_rect = {
    0, 0, m_decodeCtx->width, m_decodeCtx->height };
		m_pixelFmt = m_decodeCtx->pix_fmt;
		// 重要:获取相应视频流的时基,写入文件用
		m_timebase = m_formatCtx->streams[m_streamIndex]->time_base;

		m_inited = true;
	} while (0);

	if (err != ERROR_CODE_OK) {
   
		LOGGER::Logger::log(LOGGER::LOG_TYPE_ERROR, "[%s] init vstream captor error: %s, last error: %lu",
			__FUNCTION__, HCMDR_GET_ERROR_DESC(err), GetLastError());
		cleanup();
	}

	return err;
}

其中最重要的initStream实现如下:

int VStreamCaptor::initStream()
{
   
	int err = ERROR_CODE_OK;

	do {
   
		if (m_formatCtx == nullptr) {
   
			m_formatCtx = avformat_alloc_context();
		}
		if (m_formatCtx == nullptr) {
   
			err = ERROR_CODE_FFMPEG_ALLOC_CONTEXT_FAILED;
			break;
		}
		if (m_decodeCtx == nullptr) {
   
			m_decodeCtx = avcodec_alloc_context3(nullptr);
		}
		if (m_decodeCtx == nullptr) {
   
			err = ERROR_CODE_FFMPEG_ALLOC_CONTEXT_FAILED;
			break;
		}

		AVDictionary* options = nullptr;
		if (m_deviceId.find("rtsp://") != std::string::npos) {
   
			av_dict_set(&options, "rtsp_transport", "tcp", 0);
			av_dict_set(&options, "stimeout", "8000000", 0);
		}
		int ret = avformat_open_input(&m_formatCtx, m_deviceId.c_str(), nullptr, &options)
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值