FFplay源码分析-EOF

《FFmpeg原理》的社群来了,想加入社群的朋友请购买 VIP 版,VIP 版有更高级的内容与答疑服务。


本系列 以 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 源码分析,文件播放结束分析完毕。

©版权所属:弦外之音。

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Loken2020

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值