以前我使用完整的音频文件读取音频样本CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer.现在我想使用范围做同样的事情(即我指定时间范围......按时间读取一小部分音频,然后再返回并再次阅读).我想使用时间范围的原因是b/c我想控制每次读取的大小(以适应具有最大大小的数据包).
由于某种原因,每次阅读之间总会有一个颠簸.在我的代码中,你会注意到我启动AVAssetReader并在每次设置时间范围时结束它,这是b/c我无法在阅读器启动后动态调整时间范围(有关详细信息,请参见此处).
可能是因为开始和结束读者太昂贵而无法产生持续的实时体验?或者还有其他方法可以做到这一点,我不知道吗?
还要注意,这个抖动或延迟发生在我设置时间间隔的任何时候......这让我相信以我的方式开始和结束读者对于实时音频播放来说太昂贵了.
- (void) setupReader
{
NSURL *assetURL = [NSURL URLWithString:@"ipod-library://item/item.m4a?id=1053020204400037178"];
songAsset = [AVURLAsset URLAssetWithURL:assetURL options:nil];
track = [songAsset.tracks objectAtIndex:0];
nativeTrackASBD = [self getTrackNativeSettings:track];
// set CM time parameters
assetCMTime = songAsset.duration;
CMTimeReadDurationInSeconds = CMTimeMakeWithSeconds(1, assetCMTime.timescale);
currentCMTime = CMTimeMake(0,assetCMTime.timescale);
}
-(void)readVBRPackets
{
// make sure assetCMTime is greater than currentCMTime
while (CMTimeCompare(assetCMTime,currentCMTime) == 1 )
{
NSError * error = nil;
reader = [[AVAssetReader alloc] initWithAsset:songAsset error:&error];
readerOutput = [AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:track
outputSettings:nil]; …Run Code Online (Sandbox Code Playgroud) 我已经检查过这个http://www.7twenty7.com/blog/2010/11/video-processing-with-av-foundation以逐帧获取视频。但我真正的要求是在特定时间获得一个框架。我知道这应该是可能的AVAssetReader,我想知道有没有直接的方法AVAssetReader。请就如何在特定时间获取框架提供任何指导。
我检查了AVAssetImageGenerator但这不是我真正想要的东西。
最后我找到了答案,你必须使用 timeRange 属性。这是唯一的方法。