音视频项目—基于FFmpeg和SDL的音视频播放器解析(二十二)
介绍
在本系列,我打算花大篇幅讲解我的 gitee 项目音视频播放器,在这个项目,您可以学到音视频解封装,解码,SDL渲染相关的知识。您对源代码感兴趣的话,请查看基于FFmpeg和SDL的音视频播放器
如果您不理解本文,可参考我的前一篇文章音视频项目—基于FFmpeg和SDL的音视频播放器解析(二十一)
解析
我们播放器所有的类已经解析完了,我们来看一下 main 函数如何使用函数,实现音视频的播放。
#include <iostream>
#include "log.h"
#include "demuxthread.h"
#include "avframequeue.h"
#include "decodethread.h"
#include "audiooutput.h"
#include "videooutput.h"
using namespace std;#undef main
int main(int argc, char *argv[])
{int ret = 0;cout << "Hello World!" << endl;LogInit();// queueAVPacketQueue audio_packet_queue;AVPacketQueue video_packet_queue;AVFrameQueue audio_frame_queue;AVFrameQueue video_frame_queue;AVSync avsync;avsync.InitClock();//1 .解复用DemuxThread *demux_thread = new DemuxThread(&audio_packet_queue, &video_packet_queue);ret = demux_thread->Init(argv[1]);if(ret < 0) {LogError("demux_thread.Init failed");return -1;}ret = demux_thread->Start();if(ret < 0) {LogError("demux_thread.Start() failed");return -1;}// 解码线程初始化DecodeThread *audio_decode_thread = new DecodeThread(&audio_packet_queue, &audio_frame_queue);ret = audio_decode_thread->Init(demux_thread->AudioCodecParameters());if(ret < 0) {LogError("audio_decode_thread->Init() failed");return -1;}ret = audio_decode_thread->Start();if(ret < 0) {LogError("audio_decode_thread->Start() failed");return -1;}DecodeThread *video_decode_thread = new DecodeThread(&video_packet_queue, &video_frame_queue);ret = video_decode_thread->Init(demux_thread->VideoCodecParameters());if(ret < 0) {LogError("video_decode_thread->Init() failed");return -1;}ret = video_decode_thread->Start();if(ret < 0) {LogError("video_decode_thread->Start() failed");return -1;}// 初始化audio输出AudioParams audio_params = {0};memset(&audio_params, 0, sizeof(AudioParams));audio_params.channels = demux_thread->AudioCodecParameters()->channels;audio_params.channel_layout = demux_thread->AudioCodecParameters()->channel_layout;audio_params.fmt = (enum AVSampleFormat) demux_thread->AudioCodecParameters()->format;audio_params.freq = demux_thread->AudioCodecParameters()->sample_rate;audio_params.frame_size =demux_thread->AudioCodecParameters()->frame_size;AudioOutput *audio_output = new AudioOutput(&avsync, demux_thread->AudioStreamTimebase(), audio_params, &audio_frame_queue);ret = audio_output->Init();if(ret < 0) {LogError("audio_output->Init() failed");return -1;}VideoOutput *video_output = new VideoOutput(&avsync, demux_thread->VideoStreamTimebase(),&video_frame_queue, demux_thread->VideoCodecParameters()->width,demux_thread->VideoCodecParameters()->height);ret = video_output->Init();if(ret < 0) {LogError("video_output->Init() failed");return -1;}video_output->MainLoop();// 休眠120秒
// std::this_thread::sleep_for(std::chrono::milliseconds(120*1000));LogInfo("demux_thread->Stop");demux_thread->Stop();LogInfo("delete demux_thread");delete demux_thread;LogInfo("audio_decode_thread->Stop()");audio_decode_thread->Stop();LogInfo("delete audio_decode_thread");delete audio_decode_thread;LogInfo("video_decode_thread->Stop()");video_decode_thread->Stop();LogInfo("delete video_decode_thread");delete video_decode_thread;LogInfo("main finish");return 0;
}
基本流程就是解复用——》解码——》输出音频 / 输出视频
好了,未来如果有需要的再深入解析这个 main,现在这个项目先告一段落。
相关文章:
音视频项目—基于FFmpeg和SDL的音视频播放器解析(二十二)
介绍 在本系列,我打算花大篇幅讲解我的 gitee 项目音视频播放器,在这个项目,您可以学到音视频解封装,解码,SDL渲染相关的知识。您对源代码感兴趣的话,请查看基于FFmpeg和SDL的音视频播放器 如果您不理解本…...
单片机AT89C51直流电机控制电路PWM设计
wx供重浩:创享日记 对话框发送:直流电机 获取论文报告源码源程序原理图 此文将介绍一种直流电机,详细阐述了用单片机输出口所给占空比的不同实现电机的调速的设计方法;着重讨论L298用于电机驱动时特有的优势。直流电机调速具有…...
Python面经【2】
一、赋值、浅拷贝和深拷贝的区别 赋值 在python中,对象的赋值就是简单的对象引用。 1. a [1,2,"hello",[python, C]]2. b a 在上述情况下,a和b是一样的,它们指向同一片内存,b不过是a的别名,是引用。 赋值…...
邮政快递查询,邮政快递单号查询,用表格导出查询好的物流信息
批量查询邮政快递单号的物流信息,以表格的形式导出查询好的物流信息。 所需工具: 一个【快递批量查询高手】软件 邮政快递单号若干 操作步骤: 步骤1:运行【快递批量查询高手】软件,并登录 步骤2:点击主界…...
【经典小练习】输出文件路径名
文章目录 🌹问题✨思路🍔代码🛸读取文件,并把文件名保存到文件中 对指定目录下的所有 Java 文件进行编译、打包等处理; 查找指定目录下所有包含特定字符串的 Java 文件; 统计指定目录下所有 Java 文件的行数…...
【Python】【Torch】神经网络中各层输出的特征图可视化详解和示例
本文对神经网络各层特征图可视化的过程进行运行示例,方便大家使用,有助于更好的理解深度学习的过程,尤其是每层的结果。 神经网络各层特征图可视化的好处和特点如下: 可视化过程可以了解网络对图像像素的权重分布,可…...
接口测试学习路线
接口测试分为两种: 测试外部接口:系统和外部系统之间的接口 如:电商网站:支付宝支付 测试内部接口:系统内部的模块之间的联调,或者子系统之间的数据交互 测试重点:测试接口参数传递的正确性&…...
蓝桥杯官网算法赛(蓝桥小课堂)
问题描述 蓝桥小课堂开课啦! 海伦公式(Herons formula),也称为海伦-秦九韶公式,是用于计算三角形面积的一种公式,它可以通过三条边的长度来确定三角形的面积,而无需知道三角形的高度。 海伦公…...
求集合的笛卡尔乘积
求集合的笛卡尔乘积 一:【实验目的】二:【实验内容】三:【实验原理】四:代码实现: 一:【实验目的】 通过编实现给定集合A和B的笛卡尔积CAA,DAB,EBA,FAAB,GA(A*B). 二:【实验内容】…...
Linux系统常用指令大全(图文详解)
目录 前言 一、UNIX的登录与退出 1、登录 (1)执行格式: (2)步骤 2、退出 二、UNIX命令格式 三、常用命令 1、目录操作 (1)显示目录文件 ls (2)建新目录 …...
基于PLC触摸屏控制的伺服电机绕线机
摘 要 绕线机是专供连续绕制多圈电位器绕阻的专用机床设备。本文介绍了采用 PLC作为主控制机器,触摸屏作为操作界面,步进电机、伺服电机驱动的绕线机系统。描述 了触摸屏的原理、分类和触摸屏人机界面的控制方式,完成了触摸屏人机界面设计。…...
1.8 C语言之参数传递
1.8 C语言之参数传递 一、参数传递 一、参数传递 在C语言中,所有的参数传递都是值传递,也就是说,传递给被调用函数的参数值存放在临时变量中,而不是存放在原来的变量中。这与其他语言的引用传递有所不同。在C语言中,被…...
【Linux】进程间通信——system V共享内存、共享内存的概念、共享内存函数、system V消息队列、信号量
文章目录 进程间通信1.system V共享内存1.1共享内存原理1.2共享内存数据结构1.3共享内存函数 2.system V消息队列2.1消息队列原理 3.system V信号量3.1信号量原理3.2进程互斥 4.共享内存的使用示例 进程间通信 1.system V共享内存 1.1共享内存原理 共享内存区是最快的IPC形式…...
【黑马甄选离线数仓day05_核销主题域开发】
1. 指标分类 通过沟通调研,把需求进行分析、抽象和总结,整理成指标列表。指标有原子指标、派生指标、 衍生指标三种类型。 原子指标基于某一业务过程的度量值,是业务定义中不可再拆解的指标,原子指标的核心功能就是对指标…...
使用gin 代理 web网页
问web项目的代理,业界常用的方案是nginx做代理,这个是网上最多资料的。 因为我需要做自己的流量转发,也就是所有访问都要经过我的一个流量分发微服务,这和nginx作用冲突了。如果再加个nginx来做第一层方向代理和网页的静态资源代…...
计算器的模拟实现
计算器的模拟实现 一、实验题目:计算器二:实验目的:三:实验内容与实现1:【实验内容】2:【实验实现】1.计算器界面的实现,如下图所示:2:各项功能的实现,如下图…...
CentOS7搭建smb服务器
安装smb sudo yum install samba samba-client samba-common配置smb vim /etc/samba/smb.conf [shared] path /path/to/shared/folder writable yes browsable yes guest ok yes valid users yourname添加smb用户 sudo useradd youname sudo smbpasswd -a youname然后会…...
openEuler 22.03 LTS x86_64 cephadm 部署ceph 16.2.14 未完成 笔记
环境 准备三台虚拟机 10.47.76.94 node-1 10.47.76.95 node-2 10.47.76.96 node-3 下载cephadm [rootnode-1 ~]# yum install cephadm Last metadata expiration check: 0:11:31 ago on Tue 21 Nov 2023 10:00:20 AM CST. Dependencies resolved. Package …...
Java计算时间差,距结束还有几天几小时几分钟
文章目录 1、写法2、备份3、LocalDate、LocalDateTime、Date、String互转 1、写法 //静态方法,传入年月日时分秒 LocalDateTime startTime LocalDateTime.of(2023, 11, 22, 15, 09, 59); LocalDateTime endTime LocalDateTime.of(2023, 11, 30, 0, 0, 0); //计算…...
【云原生 Prometheus篇】Prometheus的动态服务发现机制与认证配置
目录 一、Prometheus服务发现的方式1.1 基于文件的服务发现1.2 基于consul的服务发现1.3 基于 Kubernetes API 的服务发现1.3.1 简介1.3.2 基于Kurbernetes发现机制的部分配置参数 二、实例一:部署基于文件的服务发现2.1 创建用于服务发现的文件2.2 修改Prometheus的…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...
