从iPod的图书馆不打.m4a的原始数据(.m4a raw data from iPod Libra

2019-09-17 04:32发布

因此,我面对的是一个非常奇怪,奇怪的问题,并想知道是否有人遇到这个问题。 我从手机音乐库抓住从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文件正确的数据。

再次感谢你的时间来帮助我。

Answer 1:

我遇到了同样的问题。 AVAssetReader只返回原始音频数据。 它适用于MP3播放,因为文件格式只是一堆包含一切玩家需要播放文件的帧。 你可能注意到,所有的ID3信息在导出的文件丢失。

.m4a的音频文件容器周围的AAC音频数据包。 您只收到的音频数据,没有进一步的信息,即采样率或征求表。

一种用于你的问题的解决方法可能是使用一个AVAssetExportSession到AVAssetTrack导出到文件在手机上,并从那里流的文件。 我想正是这种和工作.m4a的文件被写入。

下面的代码是基于苹果例如如何导出修剪音频资产 :

// create the export session
AVAssetExportSession *exportSession = [AVAssetExportSession
                                       exportSessionWithAsset: songAsset
                                       presetName:AVAssetExportPresetAppleM4A];
if (nil == exportSession)
    NSLog(@"Error");

// configure export session  output with all our parameters
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
NSString *filePath = [NSString stringWithFormat: @"%@/export.m4a", basePath];

exportSession.outputURL = [NSURL fileURLWithPath: filePath]; // output path
exportSession.outputFileType = AVFileTypeAppleM4A; // output file type

[exportSession exportAsynchronouslyWithCompletionHandler:^{
    if (AVAssetExportSessionStatusCompleted == exportSession.status)
    {
        NSLog(@"AVAssetExportSessionStatusCompleted");
    }
    else if (AVAssetExportSessionStatusFailed == exportSession.status)
    {
        // a failure may happen because of an event out of your control
        // for example, an interruption like a phone call comming in
        // make sure and handle this case appropriately
        NSLog(@"AVAssetExportSessionStatusFailed");
    }
    else
    {
        NSLog(@"Export Session Status: %d", exportSession.status);
    }
}];

这种解决方案的缺点是,该文件的同时必须在磁盘上写入。 我还在寻找一种更好的方式来处理的.m4a文件。



文章来源: .m4a raw data from iPod Library not playing