播放器线程模型

1:主线程输入文件 — 然后创建解复用线程 –
2 :解复用线程解码书pkt放入各自AV队列中 ---- 然后创建视频解码线程
3:音频解码在主线程中 由音频参数定义的回调函数决定 视频解码在视频解码线程中 并且将解码好的frame 放入解码视频队列
4:SDL开启一个音频渲染线程 从音频回调函数中取出解码好的音频文件传入声卡驱动
5:视频渲染有定义好的函数从视频解码队列中获取解码文件进行渲染

###队列定义

typedef struct PacketQueue {AVPacketList *first_pkt, *last_pkt;int nb_packets;int size;SDL_mutex *mutex;SDL_cond *cond;
} PacketQueue;

队列首尾
队列个数
队列中内容总大小
定义一个线程锁
定义一个条件变量

队列相关函数

初始化
void packet_queue_init(PacketQueue *q) {memset(q, 0, sizeof(PacketQueue));q->mutex = SDL_CreateMutex();q->cond = SDL_CreateCond();
}

从加速 从队列中取pkt 如果为空等待信号量… 得到数据返回给pkt 然后解锁

int packet_queue_get(PacketQueue *q, AVPacket *pkt, int block)
{AVPacketList *pkt1;int ret;SDL_LockMutex(q->mutex);for(;;) {if(global_video_state->quit) {fprintf(stderr, "quit from queue_get\n");ret = -1;break;}pkt1 = q->first_pkt;if (pkt1) {q->first_pkt = pkt1->next;if (!q->first_pkt)q->last_pkt = NULL;q->nb_packets--;q->size -= pkt1->pkt.size;*pkt = pkt1->pkt;av_free(pkt1);ret = 1;break;} else if (!block) {ret = 0;break;} else {fprintf(stderr, "queue is empty, so wait a moment and wait a cond signal\n");SDL_CondWait(q->cond, q->mutex);}}SDL_UnlockMutex(q->mutex);return ret;
}

给队列中增加pkt 加锁 增加pkt 发送信号量-> 解锁

int packet_queue_put(PacketQueue *q, AVPacket *pkt) {AVPacketList *pkt1;if(av_dup_packet(pkt) < 0) {return -1;}pkt1 = av_malloc(sizeof(AVPacketList));if (!pkt1)return -1;pkt1->pkt = *pkt;pkt1->next = NULL;SDL_LockMutex(q->mutex);if (!q->last_pkt)q->first_pkt = pkt1;elseq->last_pkt->next = pkt1;q->last_pkt = pkt1;q->nb_packets++;q->size += pkt1->pkt.size;//fprintf(stderr, "enqueue, packets:%d, send cond signal\n", q->nb_packets);SDL_CondSignal(q->cond);SDL_UnlockMutex(q->mutex);return 0;
}

FFmpe写一个多线程播放器1 基础逻辑和队列定义相关推荐

  1. 写一个MP3播放器(vuejs+nodejs+mongodb)

    写一个MP3播放器(vue-cli+element ui+express+mongoose) 最近刚学完vuejs,为了增进理解就写了个MP3播放器(用到了vuex,vue-router,es6).可 ...

  2. 用vue简单写一个音乐播放器

    简单地写一个功能比较全的音乐播放器 前言 因为音乐播放器是一个很可能在项目遇到的东西,早写总比晚写好.趁没事先写个. 思路 一个音乐播放器该有的东西: 封面,歌名,专辑,作者 控制器(上一首,下一首, ...

  3. 写一个音乐播放器的微信小程序

    要创建一个音乐播放器的微信小程序,您需要熟悉微信小程序的开发环境和语言(如 JavaScript 和 WXML/WXSS). 具体来说,您需要做以下几件事: 设计音乐播放器的用户界面,并使用 WXML ...

  4. java写一个音乐播放器源码_求一个JAVA音乐播放器的源代码

    展开全部 import javax.media.ControllerEvent; import javax.media.ControllerListener; import javax.media.E ...

  5. 用Kotlin写一个音乐播放器

    添加依赖 implementation "org.jetbrains.anko:anko:0.10.8" class home_frame : Fragment() {overri ...

  6. 如何写一个video播放器的demo?

    后台没有写出来,只写了个ajax加载的demo~ 可以方便的通过点击不同的li标签实现视频的切换. 等我学完java和serlet后再来填坑吧~ <!DOCTYPE html> <h ...

  7. 300行代码写一个音乐播放器小程序

    刚进公司不久,因为公司部门年后业务拓展的关系,可能在年后会被分配到公司的微信公众号组做小程序相关的开发工作,因此写了个微信小程序wx-audio踩坑.目前还有一些功能没有写完:如返回多首歌曲.控制播放 ...

  8. 项目: 用C语言写一个音乐播放器

    目录 最终效果 代码 资源地址 最终效果 代码 /************ 音乐文件中 1开头的是周杰伦的歌 2开头的是林俊杰的歌 3开头的是许嵩的歌 *************/ #include& ...

  9. 采用FFMPEG开源库和vs2008 mfc 写一个H264播放器(1)

    /*    FFMPEG动态库使用  */ 1 将一下文件拷入工程当前目录下面 http://pan.baidu.com/disk/home#dir/path=%2FFFMPEG 2 设置项目属性 1 ...

最新文章

  1. 声明与已声明不兼容_中兴今日发声明:专注芯片设计 不具备芯片制造能力
  2. 注意事项:二、sqlserver2008服务配置
  3. poj1182(加权值的并查集)
  4. 2019-12-06 数字信号处理的学科结构
  5. KNN实现“手写识别”
  6. 掌趣科技:游戏《一拳超人:最强之男》累计收入近5亿元
  7. 滴滴试行网约车遗失物品处理规则:司机返还遗失物品将收费
  8. Couldn't find executable named map_saver below /opt/ros/indigo/share/map_server
  9. 今年的移动Pwn2own破解大赛:iPhone+安卓=50万美元
  10. JIRA重启服务器后需要重启TOMCAT的解决
  11. linux添加引导菜单,为CentOS 7添加win7的引导菜单(king测)
  12. Process实操教程 | 中介效应检验
  13. 无法导入 指定文件不是注册脚本 您在注册表编辑器中只能导入二进位注册文件.reg
  14. 计算机主机ip地址题,计算机网络IP地址练习习题
  15. 什么是网站前端框架?目前常用的网站前端框架都有哪些?
  16. 皮尔逊相关系数_SPSS篇——皮尔逊相关
  17. Android直播中弹幕效果实现
  18. CSS第六天-高级技巧(元素隐藏、精灵图、CSS用户界面样式、margi负值作用、CSS三角形)
  19. 少儿编程中项目式学习的创造性
  20. LSI SAS3IRCU配置SAS3系列RAID卡

热门文章

  1. LINUX-文件I/O操作
  2. linux中创建重启脚本
  3. python生成一个含有20个随机数的列表_python随机模块22个函数详解(上)
  4. 西航职院计算机工程学院,西航职院 | 计算机工程学院组织召开2019级新生见面会...
  5. ceRNA调控机制简介
  6. [转]虚拟机安装详细图解教程及使用教程
  7. Python第三方库的安装及测试
  8. .a静态库的制作及使用
  9. 第一章 常见跨平台解决方案及Flutter架构
  10. python 公主连接,公主连接打金牛座四王有什么小技巧吗 一阶段四王图文攻略