ffplay是ffmpeg源码中提供的一个播放器实现例子。很多成熟播放器是基于ffplay修改而来的,如果想基于ffmpeg实现自己的播放器,或者维护一个基于ffmpeg的播放器,ffplay都是一个很好的切入点。

在阅读ffplay的代码前,需要先具备一定的音视频基础,这方面可以阅读雷神的博客:https://blog.csdn.net/leixiaohua1020/article/details/15811977。(除了这篇文章,还可以自行翻阅雷神的其他文章,都写的很好,浅显易懂,简洁明了)

在视频文件的播过中,一般要涉及到文件读取、解封装、解码、音视频输出、音视频同步等技术。比较完整的流程如下图(图片来自雷神博客,原图未考):

在这个流程中,主要有几个线程:

  • 读线程。读取文件、解封装
  • 音频解码线程。解码音频压缩数据为PCM数据。
  • 视频解码线程。解码视频压缩数据为图像数据。
  • 音频输出线程。基于SDL播放,该线程实际上是SDL的内部线程。
  • 视频输出线程。基于SDL播放,该线程为程序主线程。

由于存在多个线程,所以线程间的数据传递用到了多线程安全的队列,有FrameQueue和PacketQueue。

音频和视频各自独立输出的过程不可避免地会出现音视频的不同步现象,所以在输出前会有一些控制策略保证音视频的同步输出。

按照以上流程图,阅读、整理了ffplay的代码(基于ffmpeg-4.0.2),可按如下顺序阅读:

  • ffplay packet queue分析
  • ffplay frame queue分析
  • ffplay read线程分析
  • ffplay解码线程分析
  • ffplay video显示线程分析
  • ffplay audio输出线程分析
  • ffplay subtitle显示线程分析
  • ffplay音视频同步分析——基础概念
  • ffplay音视频同步分析——视频同步音频
  • ffplay音视频同步分析——音频同步视频
  • ffplay音视频同步分析——同步到外部时钟

ffplay 分析概述相关推荐

  1. android逆向分析概述_Android存储概述

    android逆向分析概述 Storage is this thing we are all aware of, but always take for granted. Not long ago, ...

  2. 实体词典 情感词典_人工智能技术落地:情感分析概述

    从自然语言处理技术的角度来看,情感分析的任务是从评论的文本中提取出评论的实体,以及评论者对该实体所表达的情感倾向,自然语言所有的核心技术问题.因此,情感分析被认为是一个自然语言处理的子任务. 情感分析 ...

  3. ffplay分析 (seek操作处理)

    <ffplay的数据结构分析> <ffplay分析(从启动到读取线程的操作)> <ffplay分析(视频解码线程的操作)> <ffplay分析(音频解码线程的 ...

  4. ffplay分析 (暂停 / 播放处理)

    <ffplay的数据结构分析> <ffplay分析(从启动到读取线程的操作)> <ffplay分析(视频解码线程的操作)> <ffplay分析(音频解码线程的 ...

  5. ffplay分析 (音视频同步:主时钟为音频)

    <ffplay的数据结构分析> <ffplay分析(从启动到读取线程的操作)> <ffplay分析(视频解码线程的操作)> <ffplay分析(音频解码线程的 ...

  6. ffplay分析 (视频从Frame(解码后)队列取数据到SDL输出)

    <ffplay的数据结构分析> <ffplay分析(从启动到读取线程的操作)> <ffplay分析(视频解码线程的操作)> <ffplay分析(音频解码线程的 ...

  7. ffplay 分析(音频从Frame(解码后)队列取数据到SDL输出)

    <ffplay的数据结构分析> <ffplay分析(从启动到读取线程的操作)> <ffplay分析(视频解码线程的操作)> <ffplay分析(音频解码线程的 ...

  8. ffplay分析(视频解码线程的操作)

    <ffplay的数据结构分析> <ffplay分析(从启动到读取线程的操作)> <ffplay分析(音频解码线程的操作)> <ffplay 分析(音频从Fra ...

  9. ffplay分析(从启动到读取数据线程插入到字幕、音频、视频解码前的队列操作)

    <ffplay的数据结构分析> <ffplay分析(视频解码线程的操作)> <ffplay分析(音频解码线程的操作)> <ffplay 分析(音频从Frame ...

  10. linux input子系统分析--概述与数据结构

    linux input子系统分析--概述与数据结构 Input子系统处理输入事务,任何输入设备的驱动程序都可以通过Input输入子系统提供的接口注册到内核,利用子系统提供的功能来与用户空间交互.输入设 ...

最新文章

  1. oracle 手动批处理,Oracle 简单备份 批处理(BAT)
  2. pyqt5从子目录加载qrc文件_PyQt5快速上手基础篇10-QSettings用法
  3. mysql 速度优化
  4. 【Matlab 控制】求函数极限
  5. bilibili深入理解计算机系统笔记(2):第一次代码重构,汇编模拟器,递归,指令周期实现。
  6. 将redis作为windows服务安装
  7. bkwin设置文本控件为多行模式
  8. vue-router 如何在当前路由下重新点击当前路由的router-link实现刷新
  9. 2019年最值得关注的五大微服务发展趋势
  10. magento图片处理 Customize Magento’s Image Resize Functionality
  11. mysql max_prepared_stmt_count_MySQL的max_prepared_stmt_count参数
  12. 分类问题的label为啥必须是 one hot 形式?
  13. python龙卷风框架_WEB框架之Tornado
  14. 深入浅出python系列(二):运算符
  15. SQLServer游标详解
  16. echarts地图自动轮播
  17. “飞扬小字典” -- 辅助记忆的小工具
  18. 【电影推荐】风吹麦浪
  19. 鸿蒙智慧屏和pro有什么区别,华为智慧屏V55i和荣耀智慧屏PRO区别对比
  20. 欧拉函数定理及其性质

热门文章

  1. JAVA调用方法 万年历
  2. 搜人2013笔试题(java)
  3. xmanager 出现Initialize Flexnet Service failed / Error code: 50003
  4. 3D建模和处理软件以及相关的库(来自中科大老师)
  5. 宏基4752g linux驱动下载,宏基4752g显卡驱动
  6. 2016版excel_想要下班直接打卡,这些Excel技巧可以帮到你
  7. Axure RP8介绍
  8. 游戏音效常见格式以及优缺点
  9. OA系统如何快速做出统计报表
  10. RK3128-android6.0-关于支持Google DRM Widevine问题