项目概述
- 以下项目是基于AVPlayer的实际运用,实现音频播放、横竖屏视频切换播放、类似抖音的竖屏全屏播放效果。
项目地址:AVPlayerAudioVideo
如果文章和项目对你有帮助,还请给个Star⭐️,你的Star⭐️是我持续输出的动力,谢谢啦😘
1.音频播放器效果:

2.竖屏和横屏的切换效果:

3.类似抖音竖屏全屏的效果:

竖屏全屏用UICollectionView实现,只创建了三个UICollectionViewCell视图实例。无论有多少视频需要播放,都是复用这三个UICollectionViewCell视图实例,有效控制内存大小,避免内存加载过大、内存爆满的情况。
UICollectionViewCell复用时有一个难点,就是记录视频当前已播放的位置,一开始用CMTime来保存发现不行,然后用CMTimeValue和CMTimeScale分别记录也是存在各种问题,后来使用AVPlayerItem来保存已播放位置才彻底解决。
遇到的问题
- 播放时,扬声器没有声音,插上耳机才有声音。
原因是app扬声器默认跟随系统声音模式,而手机调了静音模式,因此扬声器跟随静音模式,没有声音。
解决方式:设置Category,让扬声器不跟随系统声音模式。
//必须设置,否则扬声器默认跟随系统声音模式
//AVAudioSessionCategoryPlayAndRecord模式能播放能录音,该模式下声音默认出口是听筒(戴耳机才有声音),切换到扬声器通过以下方式
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker error:nil];
- 当反复快速移动滑块时,滑块会出现跳跃的现象。
这是由于移动滑块时,会调用seekToTime:
,该方法用于搜索并播放指定视频帧,执行时需要一点时间,不会立马搜索并播放到指定视频帧,此时addPeriodicTimeObserverForInterval:queue:usingBlock:
回调会设置滑块的位置,出现手指已让滑块移动到某一位置,突然有一瞬间滑块回到之前的位置,然后立马又回到手指停留的位置。
解决方式:用seekToTime:toleranceBefore:toleranceAfter:completionHandler:
代替seekToTime:
,搜索并播放到指定视频帧会有completionHandler的回调,获得该回调后再设置滑块