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

相关文章
|
2月前
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
265 4
|
3月前
|
存储 缓存 NoSQL
数据的存储--Redis缓存存储(一)
数据的存储--Redis缓存存储(一)
149 1
|
3月前
|
存储 缓存 NoSQL
数据的存储--Redis缓存存储(二)
数据的存储--Redis缓存存储(二)
59 2
数据的存储--Redis缓存存储(二)
|
6月前
|
缓存 NoSQL Java
Redis 缓存与数据库数据不一致问题
Redis 缓存与数据库数据不一致问题
125 3
|
6月前
|
存储 缓存 中间件
|
2月前
|
缓存 NoSQL PHP
Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出
本文深入探讨了Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出。文章还介绍了Redis在页面缓存、数据缓存和会话缓存等应用场景中的使用,并强调了缓存数据一致性、过期时间设置、容量控制和安全问题的重要性。
57 5
|
2月前
|
存储 缓存 算法
分布式缓存有哪些常用的数据分片算法?
【10月更文挑战第25天】在实际应用中,需要根据具体的业务需求、数据特征以及系统的可扩展性要求等因素综合考虑,选择合适的数据分片算法,以实现分布式缓存的高效运行和数据的合理分布。
|
3月前
|
缓存 监控 前端开发
处理页面缓存中数据不一致的问题
【10月更文挑战第9天】
68 2
|
3月前
|
消息中间件 缓存 NoSQL
大数据-49 Redis 缓存问题中 穿透、雪崩、击穿、数据不一致、HotKey、BigKey
大数据-49 Redis 缓存问题中 穿透、雪崩、击穿、数据不一致、HotKey、BigKey
90 2
|
5月前
|
缓存 NoSQL Linux
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
155 1
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据

热门文章

最新文章