“深入浅出”系列之FFmpeg:(1)音视频开发基础

我的音视频开发大部分内容是跟着雷霄骅大佬学习的,所以笔记也是跟雷老师的博客写的。

一、音视频相关的基础知识

首先播放一个视频文件的流程如下所示:

FFmpeg的作用就是将H.264格式的数据转换成YUV格式的数据,然后SDL将YUV显示到电脑屏幕上

SDL(Simple DirectMedia Layer)库的作用就是封装了复杂的视音频底层交互工作,简化了视音频处理的难度。

开发环境配置:如果是在Linux环境下开发,可以使用gcc编译器,并确保包含FFmpeg和SDL的头文件和库文件。在编译时,需要链接FFmpeg和SDL的库,例如使用-lavformat -lavcodec -lswscale -lavutil -lSDL2等编译选项。

二、开发相关的基础知识

1、引入FFmpeg和SDL

FFmpeg解码函数简介:

av_register_all():注册所有组件

avformat_open_input():打开输入视频文件

avformat_find_stream_info():获取视频文件信息

avcodec_find_decoder():查找解码器

av_read_frame():打开解码器

avcodec_decode_video2():从输入文件读取一帧压缩数据

avcodec_close():关闭解码器

avformat_close_input():关闭输入视频文件 

FFmpeg解码的流程图如下所示:

SDL视频显示函数简介:

SDL_Init():初始化SDL系统

SDL_CreateWindow():创建窗口SDL_Window

SDL_CreateRenderer():创建渲染器SDL_Renderer

SDL_CreateTexture():创建纹理SDL_Texture

SDL_UpdateTexture():设置纹理的数据

SDL_RenderCopy():将纹理的数据拷贝给渲染器

SDL_RenderPresent():显示

SDL_Delay():工具函数,用于延时

SDL_Quit():退出SDL系统

 SDL显示的流程如下所示:

2、初始化FFmpeg和SDL

初始化FFmpeg:使用av_register_all()函数(来注册所有的编解码器和格式。初始化其他FFmpeg组件,如解复用器、解码器等。

初始化SDL:使用SDL_Init()函数初始化SDL,传入相应的初始化标志,如SDL_INIT_VIDEO以初始化视频子系统。

3、打开音视频文件和初始化解码器

打开输入文件:使用avformat_open_input()函数打开音视频文件。

使用avformat_find_stream_info()函数查找音视频流的信息。

查找音视频流:获取音频流和视频流的索引,以便后续解码。

初始化解码器:使用avcodec_find_decoder()函数查找音频解码器和视频解码器。使用avcodec_open2()函数打开音频解码器和视频解码器。

4、创建SDL窗口和渲染器

创建窗口:使用SDL_CreateWindow()函数创建一个窗口,用于显示视频。

创建渲染器:使用SDL_CreateRenderer()函数在窗口中创建一个渲染器,用于绘制视频图像。

5、循环读取和解码音视频帧

循环读取帧:使用av_read_frame()函数循环读取音频帧和视频帧。

解码音频帧:使用音频解码器对音频帧进行解码。将解码后的音频数据传递给SDL的音频缓冲区,或者通过SDL的音频回调函数进行处理。

解码视频帧:使用视频解码器对视频帧进行解码。将解码后的图像数据转换为SDL可以处理的格式(如YUV转RGB)。使用SDL的渲染函数(如SDL_RenderCopy())将图像数据绘制到渲染器上。

6、更新和显示音视频

更新渲染目标:使用SDL_RenderPresent()函数更新渲染目标,将所有绘图操作呈现到屏幕上。

处理音频:SDL会自动处理音频的播放和缓冲区更新,如果使用了音频回调函数,则需要在回调函数中处理音频数据的解码和播放。

7、释放资源和退出

释放FFmpeg资源:关闭解码器、关闭输入文件等。

释放SDL资源:销毁渲染器、销毁窗口等。

退出SDL:使用SDL_Quit()函数退出SDL。

通过以上步骤,你可以将FFmpeg和SDL集成在一起,实现一个基本的音视频播放应用程序。当然,这只是一个简单的示例,实际应用中可能还需要处理更多的细节,如音视频同步、错误处理、资源管理等。

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

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

相关文章

【Linux】Linux开发:GDB调试器与Git版本控制工具指南

Linux相关知识点可以通过点击以下链接进行学习一起加油!初识指令指令进阶权限管理yum包管理与vim编辑器GCC/G编译器make与Makefile自动化构建 在 Linux 开发中,GDB 调试器和 Git 版本控制工具是开发者必备的利器。GDB 帮助快速定位代码问题,G…

【设计模式-2】23 种设计模式的分类和功能

在软件工程领域,设计模式是解决常见设计问题的经典方案。1994 年,Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides(四人帮,GoF)在《设计模式:可复用面向对象软件的基础》一书中系统性地总结了…

谷粒商城-高级篇完结-Sleuth+Zipkin 服务链路追踪

1、基本概念和整合 1.1、为什么用 微服务架构是一个分布式架构,它按业务划分服务单元,一个分布式系统往往有很多个服务单元。由于服务单元数量众多,业务的复杂性,如果出现了错误和异常,很难去定位 。主要体现在&#…

小米智能哑铃上市,代理 IP 视角下的智能健身新篇

在智能科技与健康生活深度融合的时代,小米以其敏锐的市场洞察力和强大的创新能力,不断拓展智能生态版图。米家智能哑铃的发布,无疑是其在智能健身领域的又一重要举措。而当我们从代理 IP 的独特视角来审视这一产品,会发现其中蕴含…

基于Python的音乐播放器 毕业设计-附源码73733

摘 要 本项目基于Python开发了一款简单而功能强大的音乐播放器。通过该音乐播放器,用户可以轻松管理自己的音乐库,播放喜爱的音乐,并享受音乐带来的愉悦体验。 首先,我们使用Python语言结合相关库开发了这款音乐播放器。利用Tkin…

实际开发中,常见pdf|word|excel等文件的预览和下载

实际开发中,常见pdf|word|excel等文件的预览和下载 背景相关类型数据之间的转换1、File转Blob2、File转ArrayBuffer3、Blob转ArrayBuffer4、Blob转File5、ArrayBuffer转Blob6、ArrayBuffer转File 根据Blob/File类型生成可预览的Base64地址基于Blob类型的各种文件的下载各种类型…

微信小程序中的 storage(本地存储)和内存是两个完全不同的存储区域

这是一个非常关键且容易混淆的概念 既然 this.globalData.appId appId 是将 appId 存储在内存中,为什么微信小程序中的 wx.getStorage 和 wx.setStorage(本地存储)中没有 appId,并且您提出了一个非常重要的疑问:stor…

【C++数据结构——查找】二叉排序树(头歌实践教学平台习题)【合集】

目录😋 任务描述 相关知识 1. 二叉排序树的基本概念 2. 二叉排序树节点结构体定义 3. 创建二叉排序树 4. 判断是否为二叉排序树 5. 递归查找关键字为 6 的结点并输出查找路径 6. 删除二叉排序树中的节点 测试说明 通关代码 测试结果 任务描述 本关任务&a…

计算机网络(第8版)第3章课后习题--透明传输

【3-11】 试分别讨论以下各种情况在什么条件下是透明传输,在什么条件下不是透明传 输。(提示:请弄清什么是“透明传输”,然后考虑能否满足其条件。) (1)普通的电话通信。 (2)互联网提供的电子邮件服务。 解 答 : 透明传输是指在数据传输…

Linux(17)——使用 DNF 安装和更新软件包

目录 一、使用 DNF 管理软件包: 1、 DNF 查找软件: 2、DNF 安装软件: 3、DNF 删除软件: 二、使用 DNF 管理软件包组: 1、DNF 显示组信息: 2、DNF 安装组: 三、使用 DNF 查看事务历史记录…

基于32单片机的智能语音家居

一、主要功能介绍 以STM32F103C8T6单片机为控制核心,设计一款智能远程家电控制系统,该系统能实现如下功能: 1、可通过语音命令控制照明灯、空调、加热器、窗户及窗帘的开关; 2、可通过手机显示和控制照明灯、空调、窗户及窗帘的开…

Qt 5.14.2 学习记录 —— 일 新项目

文章目录 1、创建2、查看代码 ---- main.cpp3、查看代码 ---- widgt.h4、查看代码 ---- widgt.cpp和widget.ui5、查看代码 ---- Empty.pro6、运行产生的中间文件 1、创建 左上角的文件,新建文件或项目。如果要写一个GUI程序,应当选择Application&#x…

linux wsl配置 redis远程连接

✅ 1. 修改 Redis 配置文件 在 WSL 的 Redis 配置文件中,找到 redis.conf 或 /etc/redis/redis.conf 文件,编辑以下配置项: ➡️ 更新 bind 配置项 将 bind 127.0.0.1 ::1 修改为: bind 0.0.0.0这样,Redis 将监听所…

Transformer从零详细解读——DASOU讲AI

1. 从全局角度概括Transformer transformer的任务是什么? 进一步细化 进一步细化,注意:每个encoder结构相同,参数不同;decoder同理 原论文中的图如下: 2.Encoder 2.1 输入部分 (1&#xff09…

ARM发布Armv9.5架构:迈向更强性能与灵活性的新时代

2024年11月30日,ARM正式发布了其最新的Armv9.5架构,这是Arm技术发展的又一重要里程碑。从表中信息来看,Armv9.5架构的发布标志着该公司的架构系列在性能、灵活性和可扩展性方面取得了进一步突破。本次发布不仅是技术上的提升,更是…

【Python运维】使用Python与Docker进行高效的容器化应用管理

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着容器化技术的广泛应用,Docker已成为现代软件开发与运维中不可或缺的工具。Docker容器提供了一种轻量级、可移植的方式来部署和管理应用…

分布式系统架构6:链路追踪

这是小卷对分布式系统架构学习的第6篇文章,关于链路追踪,之前写过traceId的相关内容:https://juejin.cn/post/7135611432808218661,不过之前写的太浅了,且不成系统,只是简单的理解,今天来捋一下…

Ubuntu 20.04安装gcc

一、安装GCC 1.更新包列表 user596785154:~$ sudo apt update2.安装gcc user596785154:~$ sudo apt install gcc3.验证安装 user596785154:~$ gcc --version二 编译C文件 1.新建workspace文件夹 user596785154:~$ mkdir workspace2.进入workspace文件夹 user596785154:~…

问题:Flask应用中的用户会话(Session)管理失效

我来分享一个常见的PythonWeb开发问题: 问题:Flask应用中的用户会话(Session)管理失效 这是一个在Flask开发中经常遇到的问题。当用户登录后,有时会话会意外失效,导致用户需要重复登录。 解决方案: 1. 首先&#x…

ansible-性能优化

一. 简述: 搞过运维自动化工具的人,肯定会发现很多运维伙伴们经常用saltstack和ansible做比较,单从执行效率上来说,ansible确实比不上saltstack(ansible使用的是ssh,salt使用的是zeromq消息队列[暂没深入了解]),但其实…