ACBAVPlayerExtension
是 AVPlayer
的一个扩展,将其转换为具有所有的 AVAudioPlayer
使用功能,并且支持流式传输。还添加了支持从 AVPlayer
流式传输的音频可视化的额外方法。这个扩展向 AVPlayer
添加了一些缺失的功能。
这个项目展示了一个简单的用法示例。ViewController 有一个 UIProgressView
,它显示 averagePower
作为音量表,同时在 AVPlayer
中流式传输音频。这与我们通常使用 AVAudioPlayer
的方式非常相似,但添加了一些额外的功能,这使得显示 averagePower
更加容易。audioPCMBufferFetchedWithCallbackBlock
可以用来获取 AVAudioPCMBuffer
,这可以用于音频可视化。添加了 stop
方法来停止播放器。
示例
设置
可以使用 Carthage 或 Cocoapods 将其集成到项目中。
Carthage
github "akhilcb/ACBAVPlayerExtension" ~> 2.1
Cocoapods
pod 'ACBAVPlayer'
AVPlayer 扩展接口
@property (nonatomic, readonly, assign) int numberOfChannels;
//stop video
- (void)stop;
/* metering */
@property (nonatomic, getter=isMeteringEnabled) BOOL meteringEnabled; /* turns level metering on or off. default is off. */
- (void)updateMeters; /* call to refresh meter values */
- (float)peakPowerForChannel:(NSUInteger)channelNumber; /* for peak power in decibels for a given channel. returns average power for now */
- (float)averagePowerForChannel:(NSUInteger)channelNumber; /* returns average power in decibels for a given channel */
//use this to repeatedly fetch average power list(in decibels) for all channels in iMeteringCallbackBlock. This block will be executed each time a value is fetched. Index of array is channel number
- (void)averagePowerListWithCallbackBlock:(ACBAVPlayerMeteringBlock)iMeteringCallbackBlock;
- (float)averagePowerInLinearFormForChannel:(NSUInteger)channelNumber; //returns in average power in linear form. Value is in between 0 to 1.
//fetch average power list in linear form(values in between 0 and 1)
- (void)averagePowerListInLinearFormWithCallbackBlock:(ACBAVPlayerMeteringBlock)iMeteringCallbackBlock;
//fetch AVAudioPCMBuffer. it has useful methods to manipuate buffers or to display a visualizer
- (void)audioPCMBufferFetchedWithCallbackBlock:(ACBAVPlayerBufferFetchedBlock)iAudioBufferFetchedBlock;
- (void)replaceCurrentItemAndUpdateMeteringForPlayerItem:(AVPlayerItem *)item; //use this instead of "replaceCurrentItemWithPlayerItem" for metering to work.
注意:这是一个测试版。可能会有一些问题(希望是次要的)。风险自负。
使用说明
self.player = [[AVPlayer alloc] initWithURL:remoteURL];
self.player.meteringEnabled = true;
[self.player averagePowerListInLinearFormWithCallbackBlock:^(NSArray *iAvgPowerList, BOOL iSuccess) {
if (iAvgPowerList.count > 0) {
double power = [iAvgPowerList[0] doubleValue];
if (iAvgPowerList.count > 1) {
double secondPower = [iAvgPowerList[1] doubleValue];
power = (power + secondPower) / 2;
}
dispatch_async(dispatch_get_main_queue(), ^{
[self.progressBar setProgress:(power * 10)];
});
}
}];
屏幕截图
许可证
MIT 许可协议
版权所有 (c) 2017, Akhil C Balan(https://github.com/akhilcb)
保留所有权利。