【音视频 ffmpeg 】直播推流QT框架搭建

简介: 【音视频 ffmpeg 】直播推流QT框架搭建

3个线程

一个做视频解码一个做音频解码一个做复用推流

视频解码线程展示

#include "videodecodethread.h"
VideodecodeThread::VideodecodeThread(QObject *parent):QThread(parent)
{avdevice_register_all();avformat_network_init();
}
void VideodecodeThread::run()
{fmt = av_find_input_format("dshow");av_dict_set(&options, "video_size",  "640*480", 0);av_dict_set(&options, "framerate",  "30", 0);ret = avformat_open_input(&pFormatCtx, "video=ov9734_azurewave_camera", fmt, &options);if (ret < 0){qDebug() << "Couldn't open input stream." << ret;return;}ret = avformat_find_stream_info(pFormatCtx, &options);if(ret < 0){qDebug()<< "Couldn't find stream information.";return;}videoIndex = av_find_best_stream(pFormatCtx, AVMEDIA_TYPE_VIDEO, -1, -1, &pAvCodec, 0);if(videoIndex < 0){qDebug()<< "Couldn't av_find_best_stream.";return;}pAvCodec = avcodec_find_decoder(pFormatCtx->streams[videoIndex]->codecpar->codec_id);if(!pAvCodec){qDebug()<< "Couldn't avcodec_find_decoder.";return;}qDebug()<<"avcodec_open2 pAVCodec->name:" << QString::fromStdString(pAvCodec->name);if(pFormatCtx->streams[videoIndex]->avg_frame_rate.den != 0){float fps_ = pFormatCtx->streams[videoIndex]->avg_frame_rate.num / pFormatCtx->streams[videoIndex]->avg_frame_rate.den;qDebug() <<"fps:" << fps_;}int64_t video_length_sec_ = pFormatCtx->duration/AV_TIME_BASE;qDebug() <<"video_length_sec_:" << video_length_sec_;pAvCodecCtx = avcodec_alloc_context3(pAvCodec);if(!pAvCodecCtx){qDebug()<< "Couldn't avcodec_alloc_context3.";return;}ret = avcodec_parameters_to_context(pAvCodecCtx, pFormatCtx->streams[videoIndex]->codecpar);if(ret < 0){qDebug()<< "Couldn't avcodec_parameters_to_context.";return;}pAvFrame = av_frame_alloc();pAvFrameYUV = av_frame_alloc();
//    pSwsCtx = sws_getContext(pAvCodecCtx->width, pAvCodecCtx->height, pAvCodecCtx->pix_fmt,
//                                          pAvCodecCtx->width, pAvCodecCtx->height, AV_PIX_FMT_YUV420P9,
//                                          SWS_BICUBIC, NULL, NULL, NULL);//m_size = av_image_get_buffer_size(AVPixelFormat(AV_PIX_FMT_YUV420P9), pAvCodecCtx->width, pAvCodecCtx->height, 1);//为已经分配的空间的结构体AVPicture挂上一段用于保存数据的空间//av_image_fill_arrays(pAvFrameYUV->data, pAvFrameYUV->linesize, buffer, AV_PIX_FMT_BGR32, pAvCodecCtx->width, pAvCodecCtx->height, 1);av_new_packet(packet, pAvCodecCtx->width * pAvCodecCtx->height);while(run_flag && !av_read_frame(pFormatCtx, packet)){if (packet->stream_index == videoIndex){//解码一帧视频数据int iGotPic = avcodec_send_packet(pAvCodecCtx, packet);if(iGotPic != 0){qDebug()<<"iVideoIndex avcodec_send_packet error";continue;}iGotPic = avcodec_receive_frame(pAvCodecCtx, pAvFrame);if(iGotPic == 0){//转换像素
//                sws_scale(pSwsCtx, (uint8_t const * const *)pAvFrame->data, pAvFrame->linesize, 0,
//                        pAvFrame->height, pAvFrameYUV->data, pAvFrameYUV->linesize);//buffer = (uint8_t*)av_malloc(pAvFrame->height * pAvFrame->linesize[0]);byte = QByteArray((char*)pAvFrame->data);videoQueue.push(byte);videoCount++;}}av_packet_unref(packet);}
}

ffmpeg 函数解读

后面加上音频以及复用推流过程

粉丝福利, 免费领取C++音视频学习资料包+学习路线大纲、技术视频/代码,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,编解码,推拉流,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/447701.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【前端web入门第三天】01 css定义和引入方式 四种标签选择器

文章目录: 1.css 定义 2.css引入方式 3.选择器 3.1 标签选择器 3.2 类选择器 3.3 id选择器 3.4 通配符选择器 4. 画盒子 1.css 定义 层叠样式表(Cascading Style Sheets&#xff0c;缩写为CSS)&#xff0c;是一种样式表语言&#xff0c;用来描述HTML文档的呈现&#xff08;美…

一键部署幻兽帕鲁服务器免费一年方案

一、背景介绍 简单讲一下历程&#xff0c;幻兽帕鲁从在1月19日上线&#xff0c;24小时内在线人数峰值便突破200万&#xff0c;作为2024年第一款现象级游戏&#xff0c;《幻兽帕鲁》上线后&#xff0c;由于人数太多&#xff0c;频现服务器过载导致游戏卡顿掉线的情况。为了能够…

前端入门第三天

目录 一、CSS定义 二、CSS引入方式 三、基础选择器 1.标签选择器 2.类选择器 3.id选择器 4.通配符选择器 5.画盒子 四、文字控制属性 1.字体大小 2.字体粗细 3.字体倾斜 4.行高 1.行高-垂直居中 5.字体族 6.font复合属性 7.文本缩进 8.文本对齐方式 1.水平对…

C#,打印漂亮的贝尔三角形(Bell Triangle)的源程序

以贝尔数为基础&#xff0c;参考杨辉三角形&#xff0c;也可以生成贝尔三角形&#xff08;Bell triangle&#xff09;&#xff0c;也称为艾特肯阵列&#xff08;Aitkens Array&#xff09;&#xff0c;皮埃斯三角形&#xff08;Peirce Triangle&#xff09;。 贝尔三角形的构造…

Pycharm Community 配置调试Behave

前提&#xff1a;python小白&#xff0c;临时搞python项目&#xff0c;公司限制使用Pycharm版本&#xff0c;故只能使用社区版&#xff0c;然而官方有明确说明&#xff1a;只有Professional版支持Behave。故研究了半天才整清楚社区版调试Behave的设置 没有进行下面的步骤之前&…

Unity | 渡鸦避难所-9 | 角色名字及血条等信息

1 效果预览 游戏中角色的名字和血条是非常重要的元素&#xff0c;它们可以帮助玩家了解角色的身份和状态。在 Unity 中&#xff0c;可以使用 UGUI 来实现这些功能 2 实现方案 1 画布 (Canvas) 画布 (Canvas) 组件表示进行 UI 布局和渲染的抽象空间。所有 UI 元素都必须是附加…

Keil软件某些汉字输出乱码,0xFD问题,51单片机

1. 问题 keil软件输入某些汉字的时候会输出乱码&#xff0c;例如&#xff1a;升、 数 2. 原因 keil软件会忽略0xFD。 升的GB2312编码为 0xc9fd&#xff0c;keil解析为0xc9数的GB2312编码为 0xcafd&#xff0c;keil解析为0xca 关于Keil软件中0xFD问题的说明 3. 解决方案1 …

协作办公开源神器:ONLYOFFICE

目录 前言ONLYOFFICE为什么选择ONLYOFFICE强大的文档编辑功能多种协作方式多人在线协同支持跨端多平台连接器安全性极高本地部署 ONLYOFFICE 8.0版本震撼来袭可填写的 PDF 表单显示协作用户头像更新插件界面设计更快更强大 总结 前言 近几年来&#xff0c;随着互联网技术的不断…

gilab 展示测试用例结果详情页面

Python 此示例使用带有 --junitxmlreport.xml 标志的 pytest 将输出格式化为 JUnit 报告 XML 格式&#xff1a;gitlab 会自动去解析report.xml 这个文件&#xff0c;并且将每个case的测试结果展示在gitlab中pytest:stage: testscript:- pytest --junitxmlreport.xmlartifacts:w…

PyTorch的nn.Module类的详细介绍

在PyTorch中&#xff0c;nn.Module 类是构建神经网络模型的基础类&#xff0c;所有自定义的层、模块或整个神经网络架构都需要继承自这个类。nn.Module 类提供了一系列属性和方法用于管理网络的结构和训练过程中的计算。 1. PyTorch中nn.Module基类的定义 在PyTorch中&#xff…

U盘损坏电脑无法识别怎么修复?

USB闪存器简称为U盘&#xff0c;据谐音也称“优盘”&#xff0c;是一种可移动的存储设备&#xff0c;通过USB接口连接到电脑。因其便于携带且存储容量大&#xff0c;很多用户都使用U盘来存储文件资料、图片、视频等个人数据。但常使用U盘的用户&#xff0c;经常会遇到因U盘损坏…

YOLO系列助力涨点!新SOTA让缺陷检测更准更快!附开源数据集下载

缺陷检测在工业自动化、质量控制、安全检测等多个实际应用中都有着广泛的需求。因此这个方向是相对容易发表高质量论文的&#xff0c;尤其是当研究涉及到创新的算法、改进的技术、新的应用场景或显著提高检测性能时。 在这其中&#xff0c;YOLO系列算法与缺陷检测的结合已经取…