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天前
|
存储 iOS开发 开发者
使用克魔助手进行iOS数据抓包和HTTP抓包的方法详解
使用克魔助手进行iOS数据抓包和HTTP抓包的方法详解
50 0
|
1天前
|
存储 缓存 分布式计算
亿级数据如何分钟级别写入缓存?
亿级数据如何分钟级别写入缓存?
31 0
|
1天前
|
缓存 JavaScript
vue使用localStorage缓存数据
vue使用localStorage缓存数据
|
1天前
|
存储 缓存 安全
基于iOS平台的高效图片缓存策略实现
【4月更文挑战第22天】 在移动应用开发中,图片资源的加载与缓存是影响用户体验的重要因素之一。尤其对于iOS平台,由于设备存储空间的限制以及用户对流畅性的高要求,设计一种合理的图片缓存策略显得尤为关键。本文将探讨在iOS环境下,如何通过使用先进的图片缓存技术,包括内存缓存、磁盘缓存以及网络请求的优化,来提高应用的性能和响应速度。我们将重点分析多级缓存机制的设计与实现,并对可能出现的问题及其解决方案进行讨论。
|
1天前
|
存储 缓存 算法
实现iOS平台的高效图片缓存策略
【4月更文挑战第22天】在移动应用开发中,图片资源的处理是影响用户体验的重要因素之一。特别是对于图像资源密集型的iOS应用,如何有效地缓存图片以减少内存占用和提升加载速度,是开发者们面临的关键挑战。本文将探讨一种针对iOS平台的图片缓存策略,该策略通过结合内存缓存与磁盘缓存的机制,并采用先进的图片解码和异步加载技术,旨在实现快速加载的同时,保持应用的内存效率。
|
1天前
|
缓存 NoSQL 算法
17- 数据库有1000万数据 ,Redis只能缓存20w数据, 如何保证Redis中的数据都是热点数据 ?
保证Redis中的20w数据为热点数据,可以通过设置Redis的LFU(Least Frequently Used)淘汰策略。这样,当数据库有1000万数据而Redis仅能缓存20w时,LFU会自动移除使用频率最低的项,确保缓存中的数据是最常使用的。
67 8
|
1天前
|
存储 缓存 NoSQL
数据缓存,可以尝试用RocksDB了
`shigen`,一个专注于Java、Python、Vue和Shell的博主,探讨了为何在学习阿里云DRM产品时选择RocksDB而非Redis或Guava。RocksDB是一个高速、可配置的存储系统,适用于Flash和HDFS,支持数据压缩。与Redis相比,RocksDB在高速存储和灵活性上更具优势。在尝试使用RocksDB与SpringBoot集成时遇到问题,目前尚未解决。他还对比了RocksDB、Redis和Guava Cache的特性,强调RocksDB适合大规模、高性能场景,而Redis适合内存存储和实时性需求。
13 0
数据缓存,可以尝试用RocksDB了
|
1天前
|
存储 缓存 NoSQL
Redis入门到通关之Redis缓存数据实战
Redis入门到通关之Redis缓存数据实战
23 0
|
1天前
|
存储 缓存 iOS开发
基于iOS的高效图片缓存策略实现
【4月更文挑战第9天】在移动应用开发中,图片资源的加载与缓存是影响用户体验的重要因素之一。特别是对于iOS平台,合理设计图片缓存策略不仅能够提升用户浏览图片时的流畅度,还能有效降低应用程序的内存压力。本文将介绍一种针对iOS环境优化的图片缓存技术,该技术通过多级缓存机制和内存管理策略,实现了图片快速加载与低内存消耗的目标。我们将从系统架构、关键技术细节以及性能评估等方面展开讨论,为开发者提供一套实用的图片缓存解决方案。
23 0