初级音视频播放器

学习源码库:0voice · GitHub

本人仓库:https://github.com/xiaotangnaichafeitang/ffmpeg_sdl_player_learn.git

学习目的

使用FFmpeg

音视频解复用、解码流程

声音播放和画面显示流程

音视频同步原理和实现音视频同步

项目结构

媒体文件(time.mp4)-->解复用器(音视频解封装)
||
--ACC-->音频包队列-->音频解码-->采样帧队列------>音频处理-->扬声器

|    (Packet queue) (Frame queue) | (SDL AuidoOutPut)

-                                                                | 同步控制

--H264-->视频包队列-->视频解码-->视频帧队列------>视频处理-->显示器
     (Packet queue) (Framequeue) (SDL VideoOutPut)

资源管理与清理模块(Resource Management and Cleanup Module

  • 功能概述:负责对整个播放器使用过程中分配的各种资源(如AVFormatContext、AVCodecContext、各种AVFrame、内存缓冲区、第三方库相关的对象等)进行合理的释放和清理,避免内存泄漏等问题,确保播放器在关闭或者播放结束后系统资源能正确回收。

  • 涉及 FFmpeg API 调用:会使用avformat_close_input来关闭打开的媒体文件输入流并释放对应的AVFormatContext相关资源,avcodec_free_context用于释放解码器上下文相关资源,对于AVFrame等数据结构体,调用av_frame_free进行释放,同时也要调用第三方库(如 SDL)的相关函数来清理它们所创建的窗口、渲染器等对象所占用的资源。

解复用模块(Demuxing Module

  • 功能概述:该模块负责从输入的媒体文件(比如常见的 MP4、AVI 等格式)或者流中分离出音频流、视频流以及可能存在的字幕流等不同的媒体流成分。它会解析媒体文件的容器格式,找到各个流对应的索引和相关参数信息。

  • 涉及 FFmpeg API 调用:主要会使用avformat_open_input函数来打开输入的媒体文件或者流,创建对应的AVFormatContext结构体,这个结构体包含了整个媒体文件格式相关的上下文信息。接着通过avformat_find_stream_info进一步获取流的详细信息,然后遍历AVFormatContext中的streams数组,根据codec_type(音频、视频、字幕等类型)来确定并提取出想要的流。

解码模块(Decoding Module

  • 功能概述:针对解复用模块分离出的音频流和视频流等,分别进行相应的解码操作,将其从压缩编码格式(例如 H.264、AAC 等)转换为可以直接播放或者进一步处理的原始数据格式(如未压缩的视频像素数据、音频 PCM 数据)。

  • 涉及 FFmpeg API 调用:首先要根据流中的编码信息,通过avcodec_find_decoder找到对应的解码器,然后使用avcodec_alloc_context3分配解码器上下文结构体AVCodecContext,并将流中的相关参数(比如码率、分辨率等信息对于视频,采样率等对于音频)赋值给这个上下文结构体。接着调用avcodec_open2打开解码器,之后循环读取解复用模块传来的数据包(使用av_read_frame等函数获取),送入解码器进行解码(avcodec_send_packetavcodec_receive_frame配合使用来实现解码过程),得到解码后的原始帧数据(视频为AVFrame结构体表示的图像帧,音频为 PCM 数据等)。

音频处理模块(Audio Processing Module

  • 功能概述:对解码后的音频数据进行一些必要的处理,比如音频的重采样(如果原始音频采样率和播放设备要求的不一致时)、声道转换(例如从立体声转换为单声道等情况)、音量调节等操作,以使得音频能够适配播放设备并且达到较好的播放效果。

  • 涉及 FFmpeg API 调用:对于音频重采样,会使用swr_allocswr_init等函数初始化SwrContext结构体来进行相关配置,然后通过swr_convert函数实现实际的重采样操作。对于音量调节等简单处理,可以根据音频 PCM 数据的格式(比如有符号 16 位整数等)按一定的比例去修改每个采样点的值来实现。

视频处理模块(Video Processing Module

  • 功能概述:负责处理解码后的视频帧数据,可能涉及视频图像的格式转换(例如从 YUV 格式转换为 RGB 格式以便于某些显示设备直接使用)、视频的缩放(适配不同的显示窗口大小)等操作,同时还需要考虑视频的帧率控制,按照正确的节奏来显示每一帧画面。

  • 涉及 FFmpeg API 调用:在图像格式转换方面,可利用sws_getContext来初始化SwsContext结构体,用于配置转换参数,再通过sws_scale函数完成实际的 YUV 到 RGB 等格式转换工作。对于视频缩放,可以在初始化SwsContext时设置目标分辨率等参数实现。帧率控制方面,则需要记录每帧的时间戳等信息,结合系统的时间相关函数来按正确的时间间隔显示视频帧。

播放模块(Playback Module

  • 功能概述:将经过音频处理模块和视频处理模块处理后的音频和视频数据输出到对应的播放设备上进行播放,音频通过音频输出设备(如扬声器等)播放声音,视频则在屏幕等显示设备上显示图像内容。

  • 涉及 FFmpeg API 调用:在跨平台的音频播放方面,可以借助一些第三方音频播放库(如 SDL 等),FFmpeg 自身没有直接的音频设备输出函数,不过可以把处理好的音频数据传递给这些库来播放。对于视频显示,同样可利用像 SDL 这样的库,通过创建窗口、渲染器等相关对象(例如SDL_CreateWindowSDL_CreateRenderer等函数),将视频帧数据显示在对应的窗口中,按照视频帧率的节奏不断更新显示的画面。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值