2012-01-31 56 views
0

我想從3gpp視頻文件導出音頻,它不工作......有誰知道我可能做錯了什麼?這裏是我使用的代碼:用AVAssetExportSession從3gp視頻文件導出音頻

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *filePath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"newFile.m4a"]; 
NSString *tempFile = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"oldFile.3gp"]; 

AVURLAsset *asset = [AVURLAsset URLAssetWithURL:[NSURL URLWithString:tempFilePath] options:nil]; 
[asset loadValuesAsynchronouslyForKeys:[NSArray arrayWithObject:@"tracks"] completionHandler:^ { 

    //HERE IS THE PROBLEM. THE ARRAY OF TRACKS IS EMPTY FOR SOME REASON. 
    AVAssetTrack* audioTrack = [[asset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0]; 

    AVMutableComposition* audioComposition = [AVMutableComposition composition]; 
    AVMutableCompositionTrack* audioCompositionTrack = [audioComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; 
    [audioCompositionTrack insertTimeRange:[audioTrack timeRange] ofTrack:audioTrack atTime:CMTimeMake(0, 1) error:nil]; 


    AVAssetExportSession *exprortSession = [AVAssetExportSession exportSessionWithAsset:audioComposition presetName:AVAssetExportPresetAppleM4A]; 
    NSURL *toFileURL = [NSURL URLWithString:filePath]; 
    exprortSession.outputURL = toFileURL; 
    exprortSession.outputFileType = @"com.apple.m4a-audio"; 

    NSLog(@"exportAsynchronouslyWithCompletionHandler will start"); 

    [exprortSession exportAsynchronouslyWithCompletionHandler: ^(void) { 

     if (exprortSession.status == AVAssetExportSessionStatusCompleted) { 
      NSLog(@"Export success"); 
     } 
     else { 
      NSLog(@"Export failed"); 
     } 
    }]; 
}]; 

回答

1

嘗試加載資產與

[AVURLAsset URLAssetWithURL:[NSURL fileURLWithPath:tempFilePath] options:nil]; 

,而不是

[AVURLAsset URLAssetWithURL:[NSURL URLWithString:tempFilePath] options:nil]; 
+0

是的。我不敢相信我看過那個。也在輸出文件中。謝謝。 – Zigglzworth 2012-02-01 13:29:52

0

當你的任務是直接操縱的音頻採樣緩衝區,你應該使用AVFoundation會給你的第二個變體:配對的AVAssetReader和AVAssetWriter設置。您可以在Apple開發人員資源的AVReaderWriterOSX中找到適當的示例代碼。除了您可以使用不同的I/O格式設置外,這也適用於iOS。可以解壓音頻爲PCM並寫回未壓縮的.wav或音頻文件。