所以我面临一个非常奇怪和奇怪的问题,想知道是否有其他人遇到过这个问题。我从手机音乐库中获取 MPMediaItem 的原始数据,然后通过 HTTP 将其发送到其他地方播放。我的问题出现的地方是,当我从 .m4a 类型的文件中获取原始数据时,它似乎缺少部分。例如,如果我从 iTunes 检查的原始文件是 7.4mb,那么从我的代码中得到的大小是 7.3mb。我做了一些研究,发现 .m4a 文件实际上是一个封装,我认为我没有得到文件的封装,只是原始音乐数据,因此它是不可识别的。这是我的代码,它为我提供了来自 MPMediaItem 的原始音乐数据
NSError * error = nil;
MPMediaQuery *query = [MPMediaQuery albumsQuery];
NSArray * songs = query.items;
MPMediaItem * song = [songs objectAtIndex:socket_data_index];
AVURLAsset *songAsset = [AVURLAsset URLAssetWithURL:[song valueForProperty:MPMediaItemPropertyAssetURL] options:nil];
AVAssetReader * reader = [[AVAssetReader alloc] initWithAsset:songAsset error:&error];
AVAssetTrack * songTrack = [songAsset.tracks objectAtIndex:0];
AVAssetReaderTrackOutput * output = [[AVAssetReaderTrackOutput alloc] initWithTrack:songTrack outputSettings:nil];
[reader addOutput:output];
[output release];
[reader startReading];
while (reader.status == AVAssetReaderStatusReading)
{
AVAssetReaderTrackOutput * trackOutput = (AVAssetReaderTrackOutput *)[reader.outputs objectAtIndex:0];
CMSampleBufferRef sampleBufferRef = [trackOutput copyNextSampleBuffer];
if (sampleBufferRef)
{
CMBlockBufferRef blockBufferRef = CMSampleBufferGetDataBuffer(sampleBufferRef);
size_t length = CMBlockBufferGetDataLength(blockBufferRef);
NSMutableData * data = [[NSMutableData alloc] initWithLength:length];
CMBlockBufferCopyDataBytes(blockBufferRef, 0, length, data.mutableBytes);
[data_to_return appendData:data];
[data release];
CMSampleBufferInvalidate(sampleBufferRef);
CFRelease(sampleBufferRef);
}
}
if (reader.status == AVAssetReaderStatusFailed || reader.status == AVAssetReaderStatusUnknown)
{
// Something went wrong. Handle it.
}
if (reader.status == AVAssetReaderStatusCompleted)
{
return [[[HTTPDataResponse alloc] initWithData:data_to_return] autorelease];
}
[reader release];
我会并且将获得手机库中 .mp3 文件的正确数据,但是当涉及到 .m4a 时,它似乎缺少某些部分。
再次感谢您抽出宝贵时间帮助我。