[bilibili/ijkplayer]从后台停留一段时间,切换到前台,音视频不同步

2024-08-06 590 views
4

ijkplayer的使用我是集成到单独的播放器SDK里面的: 问题: 集成到项目之后,播放一条视频(非直播),正常播放,在播放器页面切到后台一段时间(5分钟)再进入前台。播放出现如下问题:

  • 视频滞后于声音,声音是正确的。
  • 根据播放器显示的当前播放时间判断,速度大于1.0。
  • 过程中画面有卡顿现象,画面速度降慢
  • 过一段时间之后视频追上声音。音画同步

当时这些问题在SDK里测试时没有的。怀疑是跟内存有关,但没有确定的结论,xcode上显示

  • SDK内存:123M
  • 项目内存:235M

出现如上情况,log如下

  IJKSDLGLView:display: unable to tryLock GL active: 100

硬解软解都有测试,均是上面的情况。希望撸主关注一下这个问题。

回答

3

framedrop 设置过吗

3

@raymond1012 参数设置如下

IJKFFOptions *options = [IJKFFOptions optionsByDefault];
[options setOptionIntValue:IJK_AVDISCARD_DEFAULT forKey:@"skip_frame" ofCategory:kIJKFFOptionCategoryCodec];
//解码参数,画面更清晰
[options setOptionIntValue:IJK_AVDISCARD_DEFAULT forKey:@"skip_loop_filter" ofCategory:kIJKFFOptionCategoryCodec];
//开启硬解码(调用GPU模块解码,减少CPU运算),软解码(靠CPU,加大CPU负担耗电增多)
[options setOptionIntValue:type forKey:@"videotoolbox" ofCategory:kIJKFFOptionCategoryPlayer];
//最大fps
[options setOptionIntValue:60 forKey:@"max-fps" ofCategory:kIJKFFOptionCategoryPlayer];
// 设置音量大小,256为标准音量。(要设置成两倍音量时则输入512,依此类推)
[options setPlayerOptionIntValue:256 forKey:@"vol"];

// 指定最大宽度
[options setPlayerOptionIntValue:960 forKey:@"videotoolbox-max-frame-width"];
0

最好开启硬解,另外打开framedrop

3

@raymond1012 你好,我开启了硬解,将framedrop设置成5,还是有这个问题,退到后台,搁很短的时间,打印下面log,这是再去播视频,已经音画不同步了。

IJKSDLGLView:display: unable to tryLock GL active: 300
IJKSDLGLView:display: unable to tryLock GL active: 400
IJKSDLGLView:display: unable to tryLock GL active: 500
....
1

framedrop设置成1试试

8

设置为1也不行,还是那种情况

4

麻烦提供下的iphone型号,ios版本,以及测试的sample ,另外demo试过吗

7

@raymond1012 不好意思,昨天下班之后一直有事没有及时回复。 测试环境是iPhone 6sp,iOS10.3.1。系统版本是昨天刚升的,之前也有这个问题。测试视频换过好几个,都是同样的问题。 Demo没有问题,我单独用自己的SDK测试也没问题,就是集成到项目里会出现。我是将自己的SDK打成framework,集成项目的。 我在想这个问题是不是受本身项目影响,比如内存变大,或者其他部分产生了临界值,正好满足了这个bug的条件。还有那个错误的log日志

IJKSDLGLView:display: unable to tryLock GL active: 300
IJKSDLGLView:display: unable to tryLock GL active: 400
IJKSDLGLView:display: unable to tryLock GL active: 500
....

撸主能不能给出一些建议,或者问题方向

1

log没有关系,查看下cpu占用率

7

项目的CPU占有率在20-40%之间,这个不算异常吧。出现音画不一致的情况,执行快进操作会恢复

1

iOS切换到后台之后放一段时间再切换到前台有声音但是画面卡着不会动 #2581,目录结构改变之前有这种改法,而且好像视频是m3u8时会出现这种情况

5

@youzg 试了你说的那种方案,没有解决问题,我遇到的情况是任何格式视频都有这种问题。画面也会动,就是变缓慢了,大致是0.5倍的速度

4

@xinzhengzhang IJKSDLGLView:display: unable to tryLock GL active: 300这样的日志就是由IJKSDLView.m/display:函数打印的。每次打印这种日志从后台切到前台都是有问题的,在Demo里没有这种日志输出,也没有音视频不同步的问题。 因为在我的SDK里面没问题,放到项目里才出的问题,我也不确定问题在哪里,暂时提供不了复现问题的代码。

2
@zhangferry 请问有解决问题么?在android下也会有类似情况:画面直接不同,只有声音输出。seek后正常。 @bbcallen android下有个几乎必现的方式: 1.0.7.8版本 2..播放m3u8文件(我这边是加密的,未加密的不确定) 3.不要设置超时(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "timeout"不要设置) 4.正常播放视频,然后拔掉网线(使用的是以太网测试的) 5.过30秒左右,出现buffering,插上网线(等待时间要大于缓存中可播放的时间) 6.插上网线,音频继续播放,但视频画面不动 7.seek后音视频同步恢复正常

一旦设置IjkMediaPlayer.OPT_CATEGORY_FORMAT, "timeout"超时值(比如30_000_000), 问题不再重现

9

@halfhq 我换了一种方式解决了。打开后台暂停功能:[self.player setPauseInBackground:YES];,B站播放器也是这种效果,推到后台暂停播放。

5

@zhangferry 我的情况与你的不同。 这边测试(Android)下是拔掉网线基本是必现的, 原因还未找到。

0

@zhangferry 实际上在网络糟糕时很容易出现, 比如手机上禁止移动数据,走动到离开WIFI范围。 拔掉网线仅仅是模拟网络糟糕的情况