2011-08-04 15 views
9

He estado tratando de extraer audio de un archivo .mov desde hace un tiempo y parece que no puedo hacer que funcione. Específicamente, necesito extraer el audio y guardarlo como un archivo .aif o .aiff.iOS Extrayendo audio del archivo .mov

He intentado usar una composición de AVMutable, y cargar el archivo mov como un AVAset. Agregando solo la pista de audio a la composición de AVMutable antes de finalmente usar una sesión de exportación de AVA (configurando el tipo de archivo de salida a AVFileTypeAIFF, que es el formato en el que lo necesito), para escribir el archivo en un aif.

me sale un error que dice que este tipo de archivo de salida no es válido, estoy seguro de por qué:

* Terminación de aplicación debido a excepción no detectada 'NSInvalidArgumentException', razón: 'no válido tipo de archivo de salida'

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 

No estoy seguro de si el enfoque anterior funcionaría, pero estoy abierto a la posibilidad de que estoy haciendo algo mal. Sin embargo, si alguien conoce otra forma de lograr lo que intento lograr, cualquier ayuda sería muy apreciada.

Puedo publicar un código más detallado si es necesario, pero por el momento estoy intentando algunos otros enfoques por lo que es un poco complicado en este momento.

¡Gracias por la ayuda!

+0

¿alguien tiene alguna idea? Estoy realmente atrapado con esto. – Grinneh

+0

También quiero extraer el audio del archivo de video. ¿Me puede ayudar con esto? – Harsh

Respuesta

7

Porque outputFileType es incorrecto. Para el archivo .mov, a menudo es @ "com.apple.quicktime-movie". Y el audio extraído es formato .mov. Para asegurarse, puede utilizar este método para obtener el tipo de salida soportados:

NSArray *supportedTypeArray=exportSession.supportedFileTypes;  

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

Y se puede exportar audio en formato de audio (.m4a, puede ser interpretado por AVAudioPlayer) mediante el uso de métodos como éste:

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

funciona perfectamente ... Gracias hombre ... @rajesh, tengo una que tengo que crear para obtener el audio en reversa, entonces, ¿hay alguna solución para obtener el audio inverso de cualquier archivo de audio? Dé su opinión ... – Mehul

0

Sólo pequeña información para otros (que no sabía que ..) Si usted tiene un archivo de vídeo (en mi caso fue mp4), puede reproducir sólo el audio con AVAudioPlayer. No necesita extraer (o convertir) el audio del video.