当前位置: 首页 > news >正文

ffplayer面试总结

表格
 
线程名称对应函数角色主要职责
主线程 main -> video_display 协调者/渲染者 处理 SDL 事件循环,触发视频帧的最终绘制(OpenGL/SDL),控制播放状态(暂停/停止)。
解复用线程 read_thread 总生产者 读取文件/网络流 (av_read_frame),区分音视频包,分别推入音频/视频/字幕队列。处理 Seek 操作。
解码线程 (视频) video_thread 视频消费者/生产者 从视频包队列取 Packet -> 解码为 Frame -> 放入视频帧队列。处理 PTS 计算。
解码线程 (音频) audio_thread 音频消费者/生产者 从音频包队列取 Packet -> 解码为 Frame -> 重采样/格式转换 -> 填入音频回调缓冲区。
音频回调线程 audio_callback 音频最终消费者 (由 SDL 音频子系统触发) 从音频帧队列/缓冲区取数据 -> 发送给声卡播放。这是音频时钟的基准
 

2. 详细数据流转与同步机制

A. 解复用线程 (read_thread)

  • 入口read_thread(void *arg)
  • 逻辑:
    1. 循环调用 av_read_frame() 读取 AVPacket
    2. 判断 Packet 属于视频流还是音频流。
    3. 入队: 将 Packet 推入对应的全局队列 (videoqaudioq)。
      • 这里使用了自定义的 PacketQueue 结构体(内部包含 AVPacket 链表、QMutex 锁、QWaitCondition 条件变量)。
    4. 流量控制: 如果队列满了 (queue_size > max_size),线程会阻塞等待,防止内存爆炸。
    5. Seek 处理: 如果收到 seek 请求,调用 av_seek_frame,并清空队列,通知解码线程重置状态。

B. 视频解码线程 (video_thread)

  • 入口video_thread(void *arg)
  • 逻辑:
    1. 从 videoq 取出 AVPacket
    2. 调用 avcodec_send_packet / avcodec_receive_frame 进行解码。
    3. PTS 处理: 计算当前帧的显示时间 (PTS)。
    4. 入队: 将解码后的 AVFrame 推入视频帧队列 (pictq / frame_queue)。
      • ffplay 使用了一个环形缓冲区来存储几帧待显示的图像,以应对解码速度和渲染速度的差异。
    5. 同步检查: 在入队前或出队后,会根据当前的音频时钟判断该帧是否应该丢弃(如果视频太快)或延迟显示。

C. 音频解码与回调 (audio_thread & audio_callback)

音频的处理比较特殊,因为它直接驱动播放节奏。
  1. 解码部分 (audio_thread):
    • 从 audioq 取 Packet。
    • 解码得到 PCM 数据 (AVFrame)。
    • 进行重采样 (swr_convert) 以匹配声卡要求的格式(如采样率 44100, 立体声)。
    • 将 PCM 数据写入一个大的音频缓冲区 (audio_buf) 或直接放入帧队列。
  2. 回调部分 (audio_callback):
    • 触发者: SDL 音频设备(当声卡缓冲区空了,需要更多数据时,SDL 会主动调用这个函数)。
    • 职责:
      • 从缓冲区拷贝 PCM 数据到 SDL 的输出缓冲区 (stream)。
      • 更新音频时钟: 根据已播放的字节数计算当前播放时间。这是整个播放器的“心脏”,视频线程会不断查询这个时间来决定何时显示下一帧。

D. 主线程与视频渲染

  • 事件循环SDL_PollEvent 处理用户输入(退出、暂停、全屏)。
  • 刷新循环:
    • 主线程并不一直死循环渲染,而是通过定时器或信号量唤醒。
    • 调用 video_display 从视频帧队列 (pictq) 取出最新的一帧。
    • 利用 SDL Texture 或 OpenGL 将 YUV 数据绘制到屏幕。
    • 同步等待: 如果当前帧的 PTS 晚于音频时钟,主线程会 SDL_Delay 一小会儿,实现“视频等音频”。
http://www.jsqmd.com/news/443535/

相关文章:

  • 2026年变压器/箱式变电站/配电柜/电抗器/光伏一体机厂家推荐:陕西变压器全品类实力详解 - 深度智识库
  • 二次元影像测量仪什么牌子好
  • 2026年 太空舱厂家推荐排行榜:二手/民宿/景区/露营/酒店/户外/装配式/可移动/一体式/移动/预制/智能太空舱全方位解析 - 品牌企业推荐师(官方)
  • 帝国cms.5版的编辑器默认会清除多余的word代码,如果要保留word格式怎么修改?EmpireCMS
  • 盘点2026年上海口碑好的减震器冲击试验机生产厂家,解决选购难题 - 工业推荐榜
  • 光学动作捕捉技术:机器人科研领域的数据基石与NOKOV度量动捕的应用实践
  • 国内靠谱的https证书供应商有哪些?2026年https证书申请/https证书购买渠道推荐 - 麦麦唛
  • 阿里内部“SpringCloudAlibaba全彩版学习笔记”正式开源
  • 金三银四最全Java面试题:数据结构+算法+JVM+线程+finalize+GC
  • 用C++学解析几何_C++精灵库应用_萍乡风火轮少儿编程基地
  • 2026内外螺纹磨床厂家对比:从技术实力到售后服务的综合评估 - 品牌推荐大师
  • 时间的比较函数
  • 2026 年想转行网络安全?一篇带你了解真实的网安职场!
  • 帝国cms为什么用SQL调用不能加“checked=1”条件?EmpireCMS
  • 安徽GEO优化公司哪家强?这份高性价比榜单请收好 - 麦麦唛
  • 高效学挖漏洞!全网最全挖洞平台 + 零基础到精通实战指南
  • 基于杨中科老师的GC示例,写一个Benchmark
  • 公开课 | 软件测试行业的发展与思考
  • 小龙虾Openclaw Win10系统安装指引 - Bill
  • 视程空间推出多镜头红外拼接方案,实现90°-720°全景视野!
  • 购物卡变现最佳方法,沃尔玛卡回收攻略! - 团团收购物卡回收
  • 2026分析郴州青少年叛逆学校,探讨如何选择性价比高的学校 - 工业设备
  • 解锁APP推广密码:关键词安装与ASO优化的协同效应
  • 火狐浏览器 测试住友驱动,能显示特殊字符
  • 告别听歌限制✨!Navidrome 搭建私人音乐库,cpolar 让音乐走到哪听到哪
  • 计算机毕业设计springboot试题库管理系统的设计与实现 基于Spring Boot的智慧教育题库资源管理平台设计与实现 Spring Boot框架下高校智能组卷与评测系统开发研究
  • 聊聊2026年营业信托法律服务律师,选哪家性价比高 - 工业品网
  • 食品行业高精度的椰果封杯机设备
  • 计算机毕业设计springboot学生活动管理系统 基于SpringBoot框架的高校第二课堂活动管理平台 SpringBoot驱动的校园课外活动数字化管理系统
  • 基于YOLOv8的桥梁结构(轴承,封板端部,三角撑板连接,面外加劲板)智能识别(中英文双版) | 附完整源码与效果演示