因此,我面对的是一个非常奇怪,奇怪的问题,并想知道是否有人遇到这个问题。 我从手机音乐库抓住从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];
我做的和将获得对于那些在手机图书馆,但是当涉及到.M4A它似乎缺少一些地方.mp3文件正确的数据。
再次感谢你的时间来帮助我。