2011-08-04 12 views
9

Próbowałem od czasu do czasu wyodrębnić audio z pliku .mov i po prostu nie mogę go uruchomić. W szczególności muszę wyodrębnić audio i zapisać go jako plik .aif lub .aiff.iOS Wydobywające audio z pliku .mov

Próbowałem użyć AVMutableComposition i ładowanie pliku mov jako zestawu AVA. Dodanie tylko ścieżki dźwiękowej do AVMutableComposition przed ostatecznym użyciem AVAssetExportSession (ustawienie formatu pliku wyjściowego na AVFileTypeAIFF, który jest formatem, w którym jest potrzebny), aby zapisać plik w pliku AIF.

pojawia się błąd mówiąc, że ten typ pliku wyjściowego jest nieważny, jestem pewien, dlaczego:

* Zakończenie aplikację spowodowane nieprzechwyconego wyjątku „NSInvalidArgumentException”, powód: „Nieprawidłowy typ pliku wyjściowego”

AVAssetExportSession *exporter; 
exporter = [[AVAssetExportSession alloc] initWithAsset:composition presetName:AVAssetExportPresetHighestQuality] ; 

exporter.audioMix = audioMix; 
exporter.outputURL=[NSURL fileURLWithPath:filePath]; 
exporter.outputFileType=AVFileTypeAIFF; //Error occurs on this line 

Nie jestem pewien, czy powyższe podejście zadziała, ale jestem otwarty na to, że robię coś złego. Jednakże, jeśli ktokolwiek zna inny sposób na osiągnięcie tego, co próbuję osiągnąć, to jakakolwiek pomoc byłaby ogromnie doceniona.

Mogę umieścić bardziej szczegółowy kod, jeśli jest potrzebny, ale w tej chwili próbuję kilka innych podejść, więc teraz jest trochę chaotycznie.

Dzięki za pomoc!

+0

ktoś ma jakieś pomysły? Naprawdę to utknąłem. – Grinneh

+0

Chcę również wyodrębnić audio z pliku wideo. czy możesz mi z tym pomóc? – Harsh

Odpowiedz

7

Ponieważ parametr outputFileType jest nieprawidłowy. W przypadku pliku .mov często jest to @ com.apple.quicktime-movie. A wyodrębniony dźwięk to format .mov. Aby upewnić się, można użyć tej metody, aby uzyskać obsługiwany typ pliku wyjściowego:

NSArray *supportedTypeArray=exportSession.supportedFileTypes;  

for (NSString *str in supportedTypeArray)  
    NSLog(@"%@",str); 

I można wyeksportować dźwięk w formacie audio (.m4a, mogą być odtwarzane przez AVAudioPlayer) stosując metody tak:

AVAssetExportSession *exportSession=[AVAssetExportSession exportSessionWithAsset:self.mAsset presetName:AVAssetExportPresetAppleM4A]; 

exportSession.outputURL=myUrl; 
exportSession.outputFileType=AVFileTypeAppleM4A; 
exportSession.timeRange=timeRange; 

[exportSession exportAsynchronouslyWithCompletionHandler:^{ 
    if (exportSession.status==AVAssetExportSessionStatusFailed) { 
     NSLog(@"failed"); 
    } 
}]; 
11
-(void)getAudioFromVideo { 
    float startTime = 0; 
    float endTime = 10; 
    [super viewDidLoad]; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *audioPath = [documentsDirectory stringByAppendingPathComponent:@"soundOneNew.m4a"]; 

    AVAsset *myasset = [AVAsset assetWithURL:[[NSBundle mainBundle] URLForResource:@"VideoName" withExtension:@"mp4"]]; 

    AVAssetExportSession *exportSession=[AVAssetExportSession exportSessionWithAsset:myasset presetName:AVAssetExportPresetAppleM4A]; 

    exportSession.outputURL=[NSURL fileURLWithPath:audioPath]; 
    exportSession.outputFileType=AVFileTypeAppleM4A; 

    CMTime vocalStartMarker = CMTimeMake((int)(floor(startTime * 100)), 100); 
    CMTime vocalEndMarker = CMTimeMake((int)(ceil(endTime * 100)), 100); 

    CMTimeRange exportTimeRange = CMTimeRangeFromTimeToTime(vocalStartMarker, vocalEndMarker); 
    exportSession.timeRange= exportTimeRange; 
    if ([[NSFileManager defaultManager] fileExistsAtPath:audioPath]) { 
     [[NSFileManager defaultManager] removeItemAtPath:audioPath error:nil]; 
    } 

    [exportSession exportAsynchronouslyWithCompletionHandler:^{ 
     if (exportSession.status==AVAssetExportSessionStatusFailed) { 
      NSLog(@"failed"); 
     } 
     else { 
      NSLog(@"AudioLocation : %@",audioPath); 
     } 
    }]; 
} 
+0

to działa najlepiej ... Dzięki, że jesteś człowiekiem ... @rajesh, mam jedno que, które muszę stworzyć, aby uzyskać dźwięk w odwrotnej kolejności, czy istnieje jakieś rozwiązanie, aby uzyskać zwrotny dźwięk dowolnego pliku audio? Podaj swoją recenzję .. – Mehul

0

Wystarczy niewielka informacji dla innych (nie wiedziałam, że ..) Jeśli masz plik wideo (w moim przypadku było mp4), można odtwarzać tylko dźwięk z AVAudioPlayer. Nie trzeba wyodrębniać (lub konwertować) dźwięku z wideo.