Итак, я столкнулся с очень странной и странной проблемой, и мне было интересно, сталкивался ли кто-нибудь еще с этой проблемой. Я беру необработанные данные из MPMediaItem из музыкальной библиотеки телефона, а затем отправляю их через HTTP для воспроизведения в другом месте. Моя проблема возникает, когда я беру необработанные данные из файла типа .m4a, кажется, что отсутствуют части. Например, если исходный файл, который я проверяю из iTunes, имеет размер 7,4 МБ, то, что я получу из моего кода, имеет размер 7,3 МБ. Я провел некоторое исследование и обнаружил, что файл .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, в нем, похоже, отсутствуют некоторые части.
Еще раз спасибо, что нашли время, чтобы помочь мне.