本系列 以 ffmpeg4.2 源码为准,下载地址:链接:百度网盘 提取码:g3k8

FFplay 源码分析系列以一条简单的命令开始,ffplay -i a.mp4。a.mp4下载链接:百度网盘,提取码:nl0s 。


FFplay 最后一篇文章了,本文章主要讲解,文件播放结束之后的情况,各线程处于一种什么样的状态。

read_thread 数据读取线程:

数据读取线程 里面 av_read_frame() 返回 ret 等于 -1,设置 is->eof 为 1,休眠10ms,然后继续尝试av_read_frame()读文件。代码如下:

audio_thread 音频解码线程:

因为文件播放完毕了,PacketQueue队列空了,audio_thread 会阻塞在 packet_queue_get() 里面,等待 PacketQueue 有数据可读。函数调用流程如下:

audio_thread() -> decoder_decode_frame() -> packet_queue_get()

video_thread 音频解码线程:

因为文件播放完毕了,PacketQueue队列空了,video_thread 也会阻塞在 packet_queue_get() 里面,等待 PacketQueue 有数据可读。函数调用流程如下:

video_thread() -> get_video_frame() -> decoder_decode_frame() -> packet_queue_get()

sdl_audio_callback 音频播放线程:

因为文件播放完毕了,FrameQueue队列空了,sdl_audio_callback 会阻塞在 frame_queue_peek_readable() 函数里面。函数调用流程如下:

sdl_audio_callback() -> audio_decode_frame() -> frame_queue_peek_readable()

event_loop 视频播放线程:

因为 event_loop是主线程,他不能阻塞,它还要处理seek事件,所以 video_reflesh() 里面先用 frame_queue_nb_remaining() 判断队列是否是空,如果是空直接返回,过 0.01s 再执行一次 video_reflesh()。如图:

总结:

ffplay 在播放完文件之后,默认不会立即退出,大多数线程都在阻塞等待,如果此刻你拖动进度条,就会产生一个seek操作,让这些休眠的线程重新跑起来,继续播放。


ffplay 源码分析,文件播放结束分析完毕。

©版权所属:弦外之音。

由于笔者的水平有限, 加之编写的同时还要参与开发工作,文中难免会出现一些错误或者不准确的地方,恳请读者批评指正。

FFplay源码分析-EOF相关推荐

  1. FFplay源码分析-avformat_open_input

    本系列 以 ffmpeg4.4 源码为准,主要讲解 ffplay 的 RTMP 协议解析,播放.本文使用的命令如下: ffplay -i rtmp://192.168.0.122/live/lives ...

  2. FFplay源码分析-音视频同步1

    本系列 以 ffmpeg4.2 源码为准,下载地址:链接:百度网盘 提取码:g3k8 FFplay 源码分析系列以一条简单的命令开始,ffplay -i a.mp4.a.mp4下载链接:百度网盘,提取 ...

  3. ffplay源码分析4-音视频同步

    ffplay是FFmpeg工程自带的简单播放器,使用FFmpeg提供的解码器和SDL库进行视频播放.本文基于FFmpeg工程4.1版本进行分析,其中ffplay源码清单如下: https://gith ...

  4. ffplay源码分析---播放控制

    ffplay是FFmpeg工程自带的简单播放器,使用FFmpeg提供的解码器和SDL库进行视频播放.本文基于FFmpeg工程4.1版本进行分析,其中ffplay源码清单如下: https://gith ...

  5. ffplay源码分析

    音视频同步基础概念 由于音频和视频的输出不在同一个线程,而且,也不一定会同时解出同一个pts的音频帧和视频帧.更有甚者,编码或封装的时候可能pts还是不连续的,或有个别错误的.因此,在进行音频和视频的 ...

  6. ffplay源码分析:代码框架

    1. 代码框架 本节简单梳理ffplay.c代码框架.一些关键问题及细节问题在后续章节探讨. 1.1 流程图 1.2 主线程 主线程主要实现三项功能:视频播放(音视频同步).字幕播放.SDL消息处理. ...

  7. ffplay源码分析:图像格式转换

    1. 图像格式转换 FFmpeg解码得到的视频帧的格式未必能被SDL支持,在这种情况下,需要进行图像格式转换,即将视频帧图像格式转换为SDL支持的图像格式,否则是无法正常显示的. 图像格式转换是在视频 ...

  8. 音视频技术之ffplay源码分析-音视频同步

    音视频同步的目的是为了使播放的声音和显示的画面保持一致.视频按帧播放,图像显示设备每次显示一帧画面,视频播放速度由帧率确定,帧率指示每秒显示多少帧:音频按采样点播放,声音播放设备每次播放一个采样点,声 ...

  9. FFplay源码分析-日志

    本文的环境是局域网RTMP直播,SRS部署在另一台电脑,播放是另一台电脑.ffplay 播放命令如下: .\ffplay -fflags nobuffer -x 800 -f flv -i rtmp: ...

  10. ffplay源码分析:音视频同步

    1. 音视频同步 音视频同步的目的是为了使播放的声音和显示的画面保持一致.视频按帧播放,图像显示设备每次显示一帧画面,视频播放速度由帧率确定,帧率指示每秒显示多少帧:音频按采样点播放,声音播放设备每次 ...

最新文章

  1. 问题 D: 巧求和(思维)
  2. python没有pil模块_Python离线安装PIL 模块的方法
  3. 构建一个虚拟DOM并转换为真实DOM
  4. 1.7 编程基础之字符串 32 行程长度编码 python
  5. ubuntu 自动挂载工具_Ubuntu设置开机自动挂载所有格式硬盘分区
  6. selenium常见面试题
  7. 课外题:需要排序的子数组
  8. HDU 2152 Fruit (母函数)
  9. day13-面向对象
  10. 6. CSS 属性选择器
  11. H2 database 内存数据库 学习资料
  12. 低轨卫星通信系统发展综述
  13. 网页设计师和网页前端开发我该选择哪一个
  14. Python中单线程、多线程和多进程的效率对比实验
  15. 英文文章单词自动查找脚本
  16. 别踩白块儿 开源免费(C++)
  17. Maxent软件安装及使用
  18. PTA L1-030 一帮一(详解)
  19. i2c信号的ACK与NACK
  20. Oracle 游标遍历 显式游标 静态游标 OPEN v_cur(); WHILE v_cur%FOUND LOOP; LOOP FETCH v_cur INTO v_row

热门文章

  1. 《Axure RP 8 实战手册》pdf
  2. 华为交换机Console密码重置
  3. p104规约测试软件,基于IEC60870-5-104规约的智能配电网终端设备测试方案及软件设计...
  4. ypid编码是什么_国家药品供应保障综合管理信息平台YPID编码规则与应用
  5. 射击类游戏html代码,超简单射击游戏
  6. 用CDR(coreldraw)怎么把图片转为矢量图
  7. 移动通信-多径效应,多普勒效应,菲涅尔区,阴影效应,快衰落,慢衰落
  8. 19年电赛B题巡线机器人走过的坑
  9. GCode软件使用说明书
  10. 电脑双网卡访问内外网