小编Pet*_*ter的帖子

如何使用AVAssetReader在iOS上正确读取解码的PCM样本 - 目前不正确的解码

我目前正在申请作为我的计算机科学学士学位的一部分.该应用程序将关联来自iPhone硬件(加速度计,gps)和正在播放的音乐的数据.

该项目仍处于起步阶段,仅用了2个月.

我现在的那一刻,以及我需要帮助的地方,是从itunes库中的歌曲中读取PCM样本,然后使用音频单元播放它们.目前我想要实现的实现如下:从iTunes中选择一首随机歌曲,并在需要时从中读取样本,并将其存储在缓冲区中,我们称之为sampleBuffer.稍后在消费者模型中,音频单元(具有混音器和remoteIO输出)具有回调,我只需将sampleBuffer中所需数量的样本复制到回调中指定的缓冲区中.我通过扬声器听到的东西并不是我所期待的; 我可以认识到它正在播放这首歌,但似乎它被错误地解码并且它有很多噪音!我附上了一个显示前半秒钟(24576个样本@ 44.1kHz)的图像,这不像一个看起来很小的输出.在我进入列表之前,我已经检查过文件没有损坏,类似地我已经为缓冲区编写了测试用例(所以我知道缓冲区不会改变样本),虽然这可能不是最好的方法(有些人会主张去音频队列路线),我想对样本进行各种操作,以及在完成之前更改歌曲,重新排列播放的歌曲等等.此外,音频中可能有一些不正确的设置但是,显示样本的图形(显示样本被错误地解码)直接从缓冲区获取,因此我现在只想解决为什么从磁盘读取和解码不能正常工作.现在我只想通过工作获得一个游戏.无法发布图片,因为新的stackoverflow因此是图像的链接:http://i.stack.imgur.com/RHjlv.jpg

清单:

这是我设置audioReadSettigns的地方,它将用于AVAssetReaderAudioMixOutput

// Set the read settings
    audioReadSettings = [[NSMutableDictionary alloc] init];
    [audioReadSettings setValue:[NSNumber numberWithInt:kAudioFormatLinearPCM]
                         forKey:AVFormatIDKey];
    [audioReadSettings setValue:[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey];
    [audioReadSettings setValue:[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsBigEndianKey];
    [audioReadSettings setValue:[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsFloatKey];
    [audioReadSettings setValue:[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsNonInterleaved];
    [audioReadSettings setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey];
Run Code Online (Sandbox Code Playgroud)

现在,下面的代码清单是一个接收带有歌曲的persistant_id的NSString的方法:

-(BOOL)setNextSongID:(NSString*)persistand_id {

assert(persistand_id != nil);

MPMediaItem *song = [self getMediaItemForPersistantID:persistand_id];
NSURL *assetUrl = [song valueForProperty:MPMediaItemPropertyAssetURL];
AVURLAsset *songAsset = [AVURLAsset URLAssetWithURL:assetUrl 
                                            options:[NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] 
                                                                                forKey:AVURLAssetPreferPreciseDurationAndTimingKey]];


NSError *assetError = nil;

assetReader = [[AVAssetReader assetReaderWithAsset:songAsset error:&assetError] retain];

if …
Run Code Online (Sandbox Code Playgroud)

audio core-audio pcm ios avassetreader

4
推荐指数
1
解决办法
1万
查看次数

标签 统计

audio ×1

avassetreader ×1

core-audio ×1

ios ×1

pcm ×1