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

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

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

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

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

FFmpeg的作用就是将H.264格式的数据转换成YUV格式的数据,然后SDL将YUV显示到电脑屏幕上,FFmpeg可以用来、转码、压缩、剪辑、滤镜、水印、录屏、Gif等用途。

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.lryc.cn/news/518458.html

相关文章:

  • Springboot3.4整合jsp
  • CSS:背景样式、盒子模型与文本样式
  • 算法:线性查找
  • 【计算机网络】什么是网关(Gateway)?
  • 20250106面试
  • Java 分布式锁:Redisson、Zookeeper、Spring 提供的 Redis 分布式锁封装详解
  • 智能汽车的数字钥匙安全
  • YangQG 面试题汇总
  • 急速了解什么是GPU服务器
  • 用 Python 绘制可爱的招财猫
  • Linux 获取文本部分内容
  • 01-51单片机LED与独立按键
  • 【微服务】SpringBoot 整合Redis实现延时任务处理使用详解
  • 【Java项目】基于SpringBoot的【校园交友系统】
  • Elasticsearch学习(1) : 简介、索引库操作、文档操作、RestAPI、RestClient操作
  • ls指令详讲
  • 【前端】【CSS3】基础入门知识
  • 计算机网络之---RIP协议
  • 【LeetCode Hot100 贪心算法】 买卖股票的最佳时机、跳跃游戏、划分字母区间
  • 互联网架构变迁:从 TCP/IP “呼叫” 到 NDN “内容分发” 的逐浪之旅
  • git相关操作笔记
  • jenkins 使用 ssh-agent向windows进行部署
  • MySQL入门学习笔记
  • 机器学习全流程解析:数据导入到服务上线全阶段介绍
  • C#从“Hello World!“开始
  • LVS 支持 UDP 协议代理
  • 【C++经典例题】求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句
  • Rabbitmq 具体怎么做到削峰的,是丢弃部分消费吗,有的实际场景是不允许丢弃
  • Linux渗透实战之Nullbyte靶场提权
  • (STM32笔记)十二、DMA的基础知识与用法 第三部分