音视频常见播放器框架分析

音视频面试必问:如何设计一个播放器

1.常见播放器框架分析
2.如何解决播放端延迟的问题
3.音视频如何做同步
4.快进、快退、逐帧播放如何实现

音视频开发技术精讲《常见播放器框架分析》

播放器框架

在这里插入图片描述

SDL2播放音频

使用SDL播放解码后的音频数据,SDL播放音频数据的流程
如下:
在这里插入图片描述

播放器-播放做了哪一些事情?

打开媒体文件
分析媒体流成分
查找相应的解码器
数据读取线程-读取数据包并放入包缓存队列 av_read_frame

解码线程-解码数据包得到数据帧并放入帧缓存队列
audio_ thread 音频解码线程
video_ thread视频解码

音频回调接口-读取音频数据帧
sdl_audio_callback

视频刷新线程-以音频为基准做同步显示图像
video_refresh

播放器-静音和音量控制的本质

音量控制的本质:控制采样点的幅值
静音,将采样点数值置为0
音量+,提升采样点的幅值
音量-,降低采样点的幅值

在这里插入图片描述

播放器-静音和音量控制的本质

ffplay控制音量的方式

最大音量:输出解码后的原始数据
静音:即是输出数值为0的数据 toggle_ mute( )
改变音量:通过SDL_ MixAudio改变解码后数据的幅值update_ volume()
比如下图所示(sdI
audio_ callback函数内) :

以下是ffplay的方式供参考
在这里插入图片描述

播放器-快进快退

快进和快退的本质是seek到某个点重新开始播放。

  • 跳转到指定的数据位置avformat_ seek_ file
  • 清空packet队列
  • 清空frame队列(在ffplay里面是通过serial去控制)
  • 清空解码器

seek/快进/快退: stream_ seek()/ avformat_ seek_ file()

seek播放流程

  • 左右箭头产生seek事件;
  • 将文件seek到指定时间点,清空packet队列,刷新解码器.
  • 切换时钟序列(ffplay)

注意:不同的容器(比如MP4和FLV) seek的机制是不一样的。有些容器
seek的时间会快些,有些则相对耗时。这个和容器的存储结构有关系。

FFmpeg/WebRTC/RTMP/RTSP/HLS/RTP播放器-音视频流媒体高级开发 学习资料、视频教程

猜你喜欢

转载自blog.csdn.net/weixin_52622200/article/details/124202986