【发布时间】:2012-09-21 08:21:02
【问题描述】:
我找到(自定义我找到的方法)一种转换 MpMediaItem 并获取 mp3 文件的方法。可能这不是最好的方法,但它确实有效。
有没有办法获得 *.ogg 文件而不是 *.mp3 ?什么是正确的方法?
这是我用来获取 *.mp3 文件的方法:
-(void)exportMP3:(NSURL*)url toFileUrl:(NSString*)fileURL
{
AVURLAsset *asset=[[AVURLAsset alloc] initWithURL:url options:nil];
AVAssetReader *reader=[[AVAssetReader alloc] initWithAsset:asset error:nil];
NSMutableArray *myOutputs =[[NSMutableArray alloc] init];
for(id track in [asset tracks])
{
AVAssetReaderTrackOutput *output=[AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:track outputSettings:nil];
[myOutputs addObject:output];
[reader addOutput:output];
}
[reader startReading];
NSFileHandle *fileHandle ;
NSFileManager *fm=[NSFileManager defaultManager];
if(![fm fileExistsAtPath:fileURL])
{
[fm createFileAtPath:fileURL contents:[[NSData alloc] init] attributes:nil];
}else{
NSURL *url = [NSURL URLWithString:fileURL];
[fm removeItemAtURL:url error:nil];
[fm createFileAtPath:fileURL contents:[[NSData alloc] init] attributes:nil];
}
fileHandle=[NSFileHandle fileHandleForWritingAtPath:fileURL];
[fileHandle seekToEndOfFile];
AVAssetReaderOutput *output=[myOutputs objectAtIndex:0];
int totalBuff=0;
int test = 1;
while(test == 1)
{
CMSampleBufferRef ref=[output copyNextSampleBuffer];
if(ref==NULL)
test = 0;
if(ref==NULL)
break;
//copy data to file
//read next one
AudioBufferList audioBufferList;
NSMutableData *data;
CMBlockBufferRef blockBuffer;
CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(ref, NULL, &audioBufferList, sizeof(audioBufferList), NULL, NULL, 0, &blockBuffer);
for( int y=0; y<audioBufferList.mNumberBuffers; y++ )
{
AudioBuffer audioBuffer = audioBufferList.mBuffers[y];
void *frame = audioBuffer.mData;
data = [[NSMutableData alloc] initWithBytes:frame length:audioBuffer.mDataByteSize];
}
totalBuff++;
NSLog(@"\n%d\n",totalBuff);
int time = [self.mediaPlayer durationOfCurrentItem];
if (totalBuff * 2 <= time + 1)
[fileHandle writeData:data];
}
[fileHandle closeFile];
}
【问题讨论】:
-
如果您的 MP3 编码代码正常工作,这将是一个重大突破,因为普遍接受的事实是,如果没有像 lame 这样的第三方库,就不可能将音频编码到 MP3 ios中的格式。您确定这可以正常工作,并且不只是因为音频播放器的善意而播放,它接受 mp3 文件中的其他格式吗?
标签: objective-c ios xcode ogg mpmediaitem