iOS ijkplayer 数据缓存过程 详解
iOS ijkplayer 数据缓存过程 详解
- ijkplayer buffering过程
- static voidvoid *SDL_RunThread(voidvoid *data)
- {
- @autoreleasepool {
- SDL_Thread *thread = data;
- pthread_setname_np(thread->name);
- thread->retval = thread->func(thread->data);
- return NULL;
- }
- }
- //read_thread线程在此处开启
- 在read_thread函数内 如果ijkplayer播放器处于缓冲状态ffp->packet_buffering标志位为true
- if (ffp->packet_buffering) {
- io_tick_counter = SDL_GetTickHR();
- if (abs((int)(io_tick_counter - prev_io_tick_counter)) > BUFFERING_CHECK_PER_MILLISECONDS) {
- prev_io_tick_counter = io_tick_counter;
- ffp_check_buffering_l(ffp);
- }
- }
- ffp_check_buffering_l(ffp);//此处会检查buffering缓冲状态
- 在ffp_check_buffering_l函数内会判断收到的未解码数据包个数是否大于最小能播放的数据包大小 当大于最小播放数据包
- 并且再判断音视频流的个数和音视频流的请求是否中止 如果都满足条件就修改音视频流的缓冲开关 代码如下:
- if (is->buffer_indicator_queue && is->buffer_indicator_queue->nb_packets > 0) {
- if ( (is->audioq.nb_packets > MIN_MIN_FRAMES || is->audio_stream < 0 || is->audioq.abort_request)
- && (is->videoq.nb_packets > MIN_MIN_FRAMES || is->video_stream < 0 || is->videoq.abort_request)) {
- ffp_toggle_buffering(ffp, 0);//此处关闭缓冲 开始播放
- }
- }
- 通过此处可以看出如果想修改ijkplayer的播放缓冲时间和缓冲长度 可以通过修改 MIN_MIN_FRAMES 来实现
- #define MIN_MIN_FRAMES 5
- void ffp_toggle_buffering(FFPlayer *ffp, int start_buffering)
- {
- SDL_LockMutex(ffp->is->play_mutex);
- ffp_toggle_buffering_l(ffp, start_buffering);
- SDL_UnlockMutex(ffp->is->play_mutex);
- }
- void ffp_toggle_buffering_l(FFPlayer *ffp, int buffering_on)
- {
- if (!ffp->packet_buffering)
- return;
- VideoState *is = ffp->is;
- if (buffering_on && !is->buffering_on) {
- av_log(ffp, AV_LOG_DEBUG, "ffp_toggle_buffering_l: start\n");
- is->buffering_on = 1;
- stream_update_pause_l(ffp);
- ffp_notify_msg1(ffp, FFP_MSG_BUFFERING_START);
- } else if (!buffering_on && is->buffering_on){
- av_log(ffp, AV_LOG_DEBUG, "ffp_toggle_buffering_l: end\n");
- is->buffering_on = 0;
- stream_update_pause_l(ffp);
- ffp_notify_msg1(ffp, FFP_MSG_BUFFERING_END);
- }
- }
- static void stream_update_pause_l(FFPlayer *ffp)
- {
- VideoState *is = ffp->is;
- if (!is->step && (is->pause_req || is->buffering_on)) {
- stream_toggle_pause_l(ffp, 1);
- } else {
- stream_toggle_pause_l(ffp, 0);
- }
- }
- /* pause or resume the video */
- static void stream_toggle_pause_l(FFPlayer *ffp, int pause_on)
- {
- VideoState *is = ffp->is;
- if (is->paused && !pause_on) {
- is->frame_timer += av_gettime_relative() / 1000000.0 - is->vidclk.last_updated;
- #ifdef FFP_MERGE
- if (is->read_pause_return != AVERROR(ENOSYS)) {
- is->vidclk.paused = 0;
- }
- #endif
- set_clock(&is->vidclk, get_clock(&is->vidclk), is->vidclk.serial);
- } else {
- }
- set_clock(&is->extclk, get_clock(&is->extclk), is->extclk.serial);
- is->paused = is->audclk.paused = is->vidclk.paused = is->extclk.paused = pause_on;
- SDL_AoutPauseAudio(ffp->aout, pause_on);
- }
- void SDL_AoutPauseAudio(SDL_Aout *aout, int pause_on)
- {
- if (aout && aout->pause_audio)
- aout->pause_audio(aout, pause_on);
- }
- static void aout_pause_audio(SDL_Aout *aout, int pause_on)
- {
- SDLTRACE("aout_pause_audio(%d)\n", pause_on);
- SDL_Aout_Opaque *opaque = aout->opaque;
- if (pause_on) {
- [opaque->aoutController pause];
- } else {
- [opaque->aoutController play];
- }
- }
- - (void)play
- {
- if (!_audioQueueRef)
- return;
- self.spec.callback(self.spec.userdata, NULL, 0);
- @synchronized(_lock) {
- _isPaused = NO;
- NSError *error = nil;
- if (NO == [[AVAudioSession sharedInstance] setActive:YES error:&error]) {
- NSLog(@"AudioQueue: AVAudioSession.setActive(YES) failed: %@\n", error ? [error localizedDescription] : @"nil");
- }
- OSStatus status = AudioQueueStart(_audioQueueRef, NULL);
- if (status != noErr)
- NSLog(@"AudioQueue: AudioQueueStart failed (%d)\n", (int)status);
- }
- }
- 通过以上分析可以看出当通过 ffp_toggle_buffering(ffp, 0);函数修改缓冲状态时中间会通过SDL函数来调用AudioQueue来开始播放

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
android 空调遥控器——简单发送内容
android 空调遥控器——简单发送内容 接着上一篇我们接着研究android红外开发,本篇我们以网上最开源的格力空调编码开始研究,好了废话不多说,开搞!! 1、首先我们先来了解一下格力空调的编码格式 这个网上都有 格力空调遥控器(YB0F2)红外码组成如下,按解码顺序排列 起始码(S)+35位数据码+连接码(C)+32位数据码 各种编码的电平宽度: 数据码由“0”“1”组成: 0的电平宽度为:600us低电平+600us高电平, 1的电平宽度为:600us低电平+1600us高电平 起始码S电平宽度为:9000us低电平+4500us高电平 数据码看下图 大概了解这些乱糟糟的编码之后大家县里都有一个疑问,有个蛋用,别急小编给大家一点点 拿形象点的数字拼接起来 2、数据拼接 (四个部分:起始码+35数据码+连接码+32数据码 分别:1位+35位+1位+32位=69位X2=138个时间)(每位由一个高和一个低组成) 由于这个属于命令编码 在好多地方都能用得到,我们就新建一个类把它拿出来如下: 代码里面注释很清楚了自己看下 package com.gaoyu.smarttools.dat...
- 下一篇
实现一个网易云音乐的 BottomSheetDialog
作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguanh/ GitHub : https://github.com/af913337456/ 腾讯云专栏: https://cloud.tencent.com/developer/user/1148436/activities Github 开源地址 目录 前序 直观对比下 gif 效果 Android SDK 自带的 BottomSheetDialog 网易云音乐 的 BottomSheetDialog 我开源 的仿网易云音乐 BottomSheetDialog 核心代码简述 前序: 因为APP 需要参照到 网易云音乐的 BottomSheetDialog 的效果,找了一圈没找到,所以动手写了一个,涉及圈子里经常露面的知识点有下面三点,也是个实战应用 事件分发系列的--冲突处理 & 分发顺序 View 绘制流程的--Measure 模式 相对屏幕取 View 的坐标 先来直观对比下 g...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Hadoop3单机部署,实现最简伪集群
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- SpringBoot2配置默认Tomcat设置,开启更多高级功能