iOS ijkplayer 数据缓存过程 详解

简介: iOS ijkplayer 数据缓存过程 详解 [objc] view plain copy ijkplayer buffering过程 static voidvoid *SDL_RunThread(voidvoid *data) {     @autoreleasepool { .

iOS ijkplayer 数据缓存过程 详解

[objc] view plain copy

  1. ijkplayer buffering过程
  2. static voidvoid *SDL_RunThread(voidvoid *data)
  3. {
  4.     @autoreleasepool {
  5.         SDL_Thread *thread = data;
  6.         pthread_setname_np(thread->name);
  7.         thread->retval = thread->func(thread->data);
  8.         return NULL;
  9.     }
  10. }
  11. //read_thread线程在此处开启
  12. 在read_thread函数内 如果ijkplayer播放器处于缓冲状态ffp->packet_buffering标志位为true
  13.         if (ffp->packet_buffering) {
  14.             io_tick_counter = SDL_GetTickHR();
  15.             if (abs((int)(io_tick_counter - prev_io_tick_counter)) > BUFFERING_CHECK_PER_MILLISECONDS) {
  16.                 prev_io_tick_counter = io_tick_counter;
  17.                 ffp_check_buffering_l(ffp);
  18.             }
  19.         }
  20. ffp_check_buffering_l(ffp);//此处会检查buffering缓冲状态
  21. 在ffp_check_buffering_l函数内会判断收到的未解码数据包个数是否大于最小能播放的数据包大小 当大于最小播放数据包
  22. 并且再判断音视频流的个数和音视频流的请求是否中止 如果都满足条件就修改音视频流的缓冲开关 代码如下:
  23.         if (is->buffer_indicator_queue && is->buffer_indicator_queue->nb_packets > 0) {
  24.             if (   (is->audioq.nb_packets > MIN_MIN_FRAMES || is->audio_stream < 0 || is->audioq.abort_request)
  25.                 && (is->videoq.nb_packets > MIN_MIN_FRAMES || is->video_stream < 0 || is->videoq.abort_request)) {
  26.                 ffp_toggle_buffering(ffp, 0);//此处关闭缓冲 开始播放
  27.             }
  28.         }
  29. 通过此处可以看出如果想修改ijkplayer的播放缓冲时间和缓冲长度 可以通过修改 MIN_MIN_FRAMES 来实现
  30. #define MIN_MIN_FRAMES      5
  31. void ffp_toggle_buffering(FFPlayer *ffp, int start_buffering)
  32. {
  33.     SDL_LockMutex(ffp->is->play_mutex);
  34.     ffp_toggle_buffering_l(ffp, start_buffering);
  35.     SDL_UnlockMutex(ffp->is->play_mutex);
  36. }
  37. void ffp_toggle_buffering_l(FFPlayer *ffp, int buffering_on)
  38. {
  39.     if (!ffp->packet_buffering)
  40.         return;
  41.     VideoState *is = ffp->is;
  42.     if (buffering_on && !is->buffering_on) {
  43.         av_log(ffp, AV_LOG_DEBUG, "ffp_toggle_buffering_l: start\n");
  44.         is->buffering_on = 1;
  45.         stream_update_pause_l(ffp);
  46.         ffp_notify_msg1(ffp, FFP_MSG_BUFFERING_START);
  47.     } else if (!buffering_on && is->buffering_on){
  48.         av_log(ffp, AV_LOG_DEBUG, "ffp_toggle_buffering_l: end\n");
  49.         is->buffering_on = 0;
  50.         stream_update_pause_l(ffp);
  51.         ffp_notify_msg1(ffp, FFP_MSG_BUFFERING_END);
  52.     }
  53. }
  54. static void stream_update_pause_l(FFPlayer *ffp)
  55. {
  56.     VideoState *is = ffp->is;
  57.     if (!is->step && (is->pause_req || is->buffering_on)) {
  58.         stream_toggle_pause_l(ffp, 1);
  59.     } else {
  60.         stream_toggle_pause_l(ffp, 0);
  61.     }
  62. }
  63. /* pause or resume the video */
  64. static void stream_toggle_pause_l(FFPlayer *ffp, int pause_on)
  65. {
  66.     VideoState *is = ffp->is;
  67.     if (is->paused && !pause_on) {
  68.         is->frame_timer += av_gettime_relative() / 1000000.0 - is->vidclk.last_updated;
  69. #ifdef FFP_MERGE
  70.         if (is->read_pause_return != AVERROR(ENOSYS)) {
  71.             is->vidclk.paused = 0;
  72.         }
  73. #endif
  74.         set_clock(&is->vidclk, get_clock(&is->vidclk), is->vidclk.serial);
  75.     } else {
  76.     }
  77.     set_clock(&is->extclk, get_clock(&is->extclk), is->extclk.serial);
  78.     is->paused = is->audclk.paused = is->vidclk.paused = is->extclk.paused = pause_on;
  79.     SDL_AoutPauseAudio(ffp->aout, pause_on);
  80. }
  81. void SDL_AoutPauseAudio(SDL_Aout *aout, int pause_on)
  82. {
  83.     if (aout && aout->pause_audio)
  84.         aout->pause_audio(aout, pause_on);
  85. }
  86. static void aout_pause_audio(SDL_Aout *aout, int pause_on)
  87. {
  88.     SDLTRACE("aout_pause_audio(%d)\n", pause_on);
  89.     SDL_Aout_Opaque *opaque = aout->opaque;
  90.     if (pause_on) {
  91.         [opaque->aoutController pause];
  92.     } else {
  93.         [opaque->aoutController play];
  94.     }
  95. }
  96. - (void)play
  97. {
  98.     if (!_audioQueueRef)
  99.         return;
  100.     self.spec.callback(self.spec.userdataNULL0);
  101.     @synchronized(_lock) {
  102.         _isPaused = NO;
  103.         NSError *error = nil;
  104.         if (NO == [[AVAudioSession sharedInstance] setActive:YES error:&error]) {
  105.             NSLog(@"AudioQueue: AVAudioSession.setActive(YES) failed: %@\n", error ? [error localizedDescription] : @"nil");
  106.         }
  107.         OSStatus status = AudioQueueStart(_audioQueueRef, NULL);
  108.         if (status != noErr)
  109.             NSLog(@"AudioQueue: AudioQueueStart failed (%d)\n", (int)status);
  110.     }
  111. }
  112. 通过以上分析可以看出当通过 ffp_toggle_buffering(ffp, 0);函数修改缓冲状态时中间会通过SDL函数来调用AudioQueue来开始播放

 原文地址http://www.bieryun.com/2905.html

相关文章
|
1月前
|
存储 缓存 NoSQL
数据的存储--Redis缓存存储(一)
数据的存储--Redis缓存存储(一)
|
1月前
|
存储 缓存 NoSQL
数据的存储--Redis缓存存储(二)
数据的存储--Redis缓存存储(二)
数据的存储--Redis缓存存储(二)
|
4月前
|
缓存 NoSQL Java
Redis 缓存与数据库数据不一致问题
Redis 缓存与数据库数据不一致问题
108 3
|
4月前
|
存储 缓存 中间件
|
24天前
|
存储 缓存 算法
分布式缓存有哪些常用的数据分片算法?
【10月更文挑战第25天】在实际应用中,需要根据具体的业务需求、数据特征以及系统的可扩展性要求等因素综合考虑,选择合适的数据分片算法,以实现分布式缓存的高效运行和数据的合理分布。
|
1月前
|
缓存 监控 前端开发
处理页面缓存中数据不一致的问题
【10月更文挑战第9天】
42 2
|
1月前
|
消息中间件 缓存 NoSQL
大数据-49 Redis 缓存问题中 穿透、雪崩、击穿、数据不一致、HotKey、BigKey
大数据-49 Redis 缓存问题中 穿透、雪崩、击穿、数据不一致、HotKey、BigKey
55 2
|
3月前
|
缓存 NoSQL Linux
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
131 1
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
|
3月前
|
存储 缓存 分布式计算
如何在 PySpark 中缓存数据以提高性能?
【8月更文挑战第13天】
175 8
|
3月前
|
iOS开发 开发者
iOS平台RTMP|RTSP播放器如何实时回调YUV数据
我们在做RTMP、RTSP播放器的时候,有开发者需要自己处理拉取到的YUV数据,做二次分析之用,为此,我们做了以下的设计:InitPlayer之后,再调用SmartPlayerStart()接口之前,设置yuv数据回调即可。