当前位置: 首页 > news >正文

音视频项目—基于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的音视频播放器解析(二十二)

介绍 在本系列&#xff0c;我打算花大篇幅讲解我的 gitee 项目音视频播放器&#xff0c;在这个项目&#xff0c;您可以学到音视频解封装&#xff0c;解码&#xff0c;SDL渲染相关的知识。您对源代码感兴趣的话&#xff0c;请查看基于FFmpeg和SDL的音视频播放器 如果您不理解本…...

单片机AT89C51直流电机控制电路PWM设计

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;直流电机 获取论文报告源码源程序原理图 此文将介绍一种直流电机&#xff0c;详细阐述了用单片机输出口所给占空比的不同实现电机的调速的设计方法&#xff1b;着重讨论L298用于电机驱动时特有的优势。直流电机调速具有…...

Python面经【2】

一、赋值、浅拷贝和深拷贝的区别 赋值 在python中&#xff0c;对象的赋值就是简单的对象引用。 1. a [1,2,"hello",[python, C]]2. b a 在上述情况下&#xff0c;a和b是一样的&#xff0c;它们指向同一片内存&#xff0c;b不过是a的别名&#xff0c;是引用。 赋值…...

邮政快递查询,邮政快递单号查询,用表格导出查询好的物流信息

批量查询邮政快递单号的物流信息&#xff0c;以表格的形式导出查询好的物流信息。 所需工具&#xff1a; 一个【快递批量查询高手】软件 邮政快递单号若干 操作步骤&#xff1a; 步骤1&#xff1a;运行【快递批量查询高手】软件&#xff0c;并登录 步骤2&#xff1a;点击主界…...

【经典小练习】输出文件路径名

文章目录 &#x1f339;问题✨思路&#x1f354;代码&#x1f6f8;读取文件&#xff0c;并把文件名保存到文件中 对指定目录下的所有 Java 文件进行编译、打包等处理&#xff1b; 查找指定目录下所有包含特定字符串的 Java 文件&#xff1b; 统计指定目录下所有 Java 文件的行数…...

【Python】【Torch】神经网络中各层输出的特征图可视化详解和示例

本文对神经网络各层特征图可视化的过程进行运行示例&#xff0c;方便大家使用&#xff0c;有助于更好的理解深度学习的过程&#xff0c;尤其是每层的结果。 神经网络各层特征图可视化的好处和特点如下&#xff1a; 可视化过程可以了解网络对图像像素的权重分布&#xff0c;可…...

接口测试学习路线

接口测试分为两种&#xff1a; 测试外部接口&#xff1a;系统和外部系统之间的接口 如&#xff1a;电商网站&#xff1a;支付宝支付 测试内部接口&#xff1a;系统内部的模块之间的联调&#xff0c;或者子系统之间的数据交互 测试重点&#xff1a;测试接口参数传递的正确性&…...

蓝桥杯官网算法赛(蓝桥小课堂)

问题描述 蓝桥小课堂开课啦&#xff01; 海伦公式&#xff08;Herons formula&#xff09;&#xff0c;也称为海伦-秦九韶公式&#xff0c;是用于计算三角形面积的一种公式&#xff0c;它可以通过三条边的长度来确定三角形的面积&#xff0c;而无需知道三角形的高度。 海伦公…...

求集合的笛卡尔乘积

求集合的笛卡尔乘积 一&#xff1a;【实验目的】二&#xff1a;【实验内容】三&#xff1a;【实验原理】四&#xff1a;代码实现&#xff1a; 一&#xff1a;【实验目的】 通过编实现给定集合A和B的笛卡尔积CAA,DAB,EBA,FAAB,GA(A*B&#xff09;. 二&#xff1a;【实验内容】…...

Linux系统常用指令大全(图文详解)

目录 前言 一、UNIX的登录与退出 1、登录 &#xff08;1&#xff09;执行格式&#xff1a; &#xff08;2&#xff09;步骤 2、退出 二、UNIX命令格式 三、常用命令 1、目录操作 &#xff08;1&#xff09;显示目录文件 ls &#xff08;2&#xff09;建新目录 …...

基于PLC触摸屏控制的伺服电机绕线机

摘 要 绕线机是专供连续绕制多圈电位器绕阻的专用机床设备。本文介绍了采用 PLC作为主控制机器&#xff0c;触摸屏作为操作界面&#xff0c;步进电机、伺服电机驱动的绕线机系统。描述 了触摸屏的原理、分类和触摸屏人机界面的控制方式&#xff0c;完成了触摸屏人机界面设计。…...

1.8 C语言之参数传递

1.8 C语言之参数传递 一、参数传递 一、参数传递 在C语言中&#xff0c;所有的参数传递都是值传递&#xff0c;也就是说&#xff0c;传递给被调用函数的参数值存放在临时变量中&#xff0c;而不是存放在原来的变量中。这与其他语言的引用传递有所不同。在C语言中&#xff0c;被…...

【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. 指标分类 ​ 通过沟通调研&#xff0c;把需求进行分析、抽象和总结&#xff0c;整理成指标列表。指标有原子指标、派生指标、 衍生指标三种类型。 ​ 原子指标基于某一业务过程的度量值&#xff0c;是业务定义中不可再拆解的指标&#xff0c;原子指标的核心功能就是对指标…...

使用gin 代理 web网页

问web项目的代理&#xff0c;业界常用的方案是nginx做代理&#xff0c;这个是网上最多资料的。 因为我需要做自己的流量转发&#xff0c;也就是所有访问都要经过我的一个流量分发微服务&#xff0c;这和nginx作用冲突了。如果再加个nginx来做第一层方向代理和网页的静态资源代…...

计算器的模拟实现

计算器的模拟实现 一、实验题目&#xff1a;计算器二&#xff1a;实验目的&#xff1a;三&#xff1a;实验内容与实现1&#xff1a;【实验内容】2&#xff1a;【实验实现】1.计算器界面的实现&#xff0c;如下图所示&#xff1a;2&#xff1a;各项功能的实现&#xff0c;如下图…...

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、写法 //静态方法&#xff0c;传入年月日时分秒 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发现机制的部分配置参数 二、实例一&#xff1a;部署基于文件的服务发现2.1 创建用于服务发现的文件2.2 修改Prometheus的…...

BetterNCM安装器完整指南:3步解锁网易云音乐无限潜力

BetterNCM安装器完整指南&#xff1a;3步解锁网易云音乐无限潜力 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer 你是否曾在使用网易云音乐时感到功能受限&#xff1f;想要更丰富的播放…...

从门电路到计数器:基于Libero的Verilog数字系统核心模块实战

1. 数字逻辑的基石&#xff1a;从门电路开始 第一次接触Verilog时&#xff0c;我被那些看似简单的门电路震撼到了。谁能想到&#xff0c;现代计算机的复杂运算&#xff0c;竟然都建立在与、或、非这些基础逻辑之上&#xff1f;在Libero软件中实现这些门电路&#xff0c;就像在搭…...

Node.js-安装部署

1 需求 …… 2 接口 …… 3 示例 …… 4 参考资料 https://zhuanlan.zhihu.com/p/2004975759790477711...

Amazon VPC CNI安全组每Pod配置:终极网络隔离方案详解

Amazon VPC CNI安全组每Pod配置&#xff1a;终极网络隔离方案详解 【免费下载链接】amazon-vpc-cni-k8s Networking plugin repository for pod networking in Kubernetes using Elastic Network Interfaces on AWS 项目地址: https://gitcode.com/gh_mirrors/am/amazon-vpc-…...

终极指南:Vuls代理配置自动化——环境变量注入与动态调整方案

终极指南&#xff1a;Vuls代理配置自动化——环境变量注入与动态调整方案 【免费下载链接】vuls Agent-less vulnerability scanner for Linux, FreeBSD, Container, WordPress, Programming language libraries, Network devices 项目地址: https://gitcode.com/gh_mirrors/…...

青少年软编等考四级题解目录

这个专栏发布中国电子学会主办的青少年软件编程等级考试 C 语言四级题目解析&#xff0c;每篇文章包含一次考试完整题目的思路解析。由于考级允许使用 C/C 语言&#xff0c;因此解析中给出的参考代码均为 C 代码。为了方便大家查找&#xff0c;特此发布一篇文章作为目录。 所有…...

Ansible之Playbook(五):高级用法

Playbook高级用法一、本地执行&#xff08;Local Action&#xff09;应用场景当控制节点&#xff08;非目标主机&#xff09;需要执行特定操作时使用&#xff0c;如生成报告、处理临时文件等。OpenEuler实现方式- name: 在控制节点生成主机清单报告hosts: alltasks:- name: 收集…...

大模型应用开发实战(6)——做一个能上线的 AI 应用,最小技术栈到底需要哪些东西

&#x1f935;‍♂️ 个人主页&#xff1a;小李同学_LSH的主页 ✍&#x1f3fb; 作者简介&#xff1a;LLM学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…...

好写作AI:科研绘图的“同声传译”,把数据方言翻译成学术普通话

你有没有过这种体验&#xff1a;跑了一周的实验数据终于出来了&#xff0c;你看着密密麻麻的数字&#xff0c;心里知道“这个东西很有意思”&#xff0c;但一张嘴就变成了“由图1可见…由图2可见…”&#xff0c;像极了一个不会说外语的游客&#xff0c;指着菜单上的图片点餐—…...

ARM开发板实战:用官方工具链交叉编译OpenSSL 1.1.1k的避坑指南

ARM开发板实战&#xff1a;官方工具链交叉编译OpenSSL 1.1.1k的深度解析 在嵌入式开发领域&#xff0c;为ARM架构设备编译OpenSSL是一个常见但充满挑战的任务。不同于x86平台的直接编译&#xff0c;交叉编译过程中会遇到各种ABI兼容性、工具链配置和参数优化问题。本文将深入探…...