FFplay源码分析-EOF
本系列 以 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相关推荐
- FFplay源码分析-avformat_open_input
本系列 以 ffmpeg4.4 源码为准,主要讲解 ffplay 的 RTMP 协议解析,播放.本文使用的命令如下: ffplay -i rtmp://192.168.0.122/live/lives ...
- FFplay源码分析-音视频同步1
本系列 以 ffmpeg4.2 源码为准,下载地址:链接:百度网盘 提取码:g3k8 FFplay 源码分析系列以一条简单的命令开始,ffplay -i a.mp4.a.mp4下载链接:百度网盘,提取 ...
- ffplay源码分析4-音视频同步
ffplay是FFmpeg工程自带的简单播放器,使用FFmpeg提供的解码器和SDL库进行视频播放.本文基于FFmpeg工程4.1版本进行分析,其中ffplay源码清单如下: https://gith ...
- ffplay源码分析---播放控制
ffplay是FFmpeg工程自带的简单播放器,使用FFmpeg提供的解码器和SDL库进行视频播放.本文基于FFmpeg工程4.1版本进行分析,其中ffplay源码清单如下: https://gith ...
- ffplay源码分析
音视频同步基础概念 由于音频和视频的输出不在同一个线程,而且,也不一定会同时解出同一个pts的音频帧和视频帧.更有甚者,编码或封装的时候可能pts还是不连续的,或有个别错误的.因此,在进行音频和视频的 ...
- ffplay源码分析:代码框架
1. 代码框架 本节简单梳理ffplay.c代码框架.一些关键问题及细节问题在后续章节探讨. 1.1 流程图 1.2 主线程 主线程主要实现三项功能:视频播放(音视频同步).字幕播放.SDL消息处理. ...
- ffplay源码分析:图像格式转换
1. 图像格式转换 FFmpeg解码得到的视频帧的格式未必能被SDL支持,在这种情况下,需要进行图像格式转换,即将视频帧图像格式转换为SDL支持的图像格式,否则是无法正常显示的. 图像格式转换是在视频 ...
- 音视频技术之ffplay源码分析-音视频同步
音视频同步的目的是为了使播放的声音和显示的画面保持一致.视频按帧播放,图像显示设备每次显示一帧画面,视频播放速度由帧率确定,帧率指示每秒显示多少帧:音频按采样点播放,声音播放设备每次播放一个采样点,声 ...
- FFplay源码分析-日志
本文的环境是局域网RTMP直播,SRS部署在另一台电脑,播放是另一台电脑.ffplay 播放命令如下: .\ffplay -fflags nobuffer -x 800 -f flv -i rtmp: ...
- ffplay源码分析:音视频同步
1. 音视频同步 音视频同步的目的是为了使播放的声音和显示的画面保持一致.视频按帧播放,图像显示设备每次显示一帧画面,视频播放速度由帧率确定,帧率指示每秒显示多少帧:音频按采样点播放,声音播放设备每次 ...
最新文章
- 问题 D: 巧求和(思维)
- python没有pil模块_Python离线安装PIL 模块的方法
- 构建一个虚拟DOM并转换为真实DOM
- 1.7 编程基础之字符串 32 行程长度编码 python
- ubuntu 自动挂载工具_Ubuntu设置开机自动挂载所有格式硬盘分区
- selenium常见面试题
- 课外题:需要排序的子数组
- HDU 2152 Fruit (母函数)
- day13-面向对象
- 6. CSS 属性选择器
- H2 database 内存数据库 学习资料
- 低轨卫星通信系统发展综述
- 网页设计师和网页前端开发我该选择哪一个
- Python中单线程、多线程和多进程的效率对比实验
- 英文文章单词自动查找脚本
- 别踩白块儿 开源免费(C++)
- Maxent软件安装及使用
- PTA L1-030 一帮一(详解)
- i2c信号的ACK与NACK
- Oracle 游标遍历 显式游标 静态游标 OPEN v_cur(); WHILE v_cur%FOUND LOOP; LOOP FETCH v_cur INTO v_row