2011-01-10 14 views
7

¿Hay alguna forma de grabar en el final de un archivo de audio? No podemos detener la grabación en lugar de detenerla, porque el usuario necesita volver a la aplicación más tarde y agregar más audio a su grabación. Actualmente, el audio se almacena en CoreData como NSData. El AppendData de NSData no funciona porque el archivo de audio resultante aún informa que solo tiene el mismo largo que los datos originales.AVAudioRecorder/AVAudioPlayer: añada la grabación al archivo

Otra posibilidad sería tomar el archivo de audio original, junto con el nuevo, y concatenarlos en un archivo de audio, si hay alguna manera de hacerlo.

+0

Eche un vistazo a mi código a continuación. Esto es lo que estoy usando en una aplicación de producción. – memmons

+0

Puede encontrar mi código completo para mearging: https://stackoverflow.com/a/49136633/2244094 –

Respuesta

1

No tengo un ejemplo de código completo, pero los servicios de archivo de audio ampliado pueden ayudarlo a concatenar dos archivos de audio. Busque los servicios de archivo de audio extendido en Xcode o visite el siguiente enlace.

Apple documentation

+0

Nada en esa documentación hace referencia a los archivos de audio que se anexan. – memmons

+0

para ser honesto eso es ref interesante, y funciona si no quieres concatenar a los archivos listos, pero quieres escribir en el archivo existente, y es impresionante (como en la grabadora de manzanas!) – KostiaZzz

4

Puede anexar dos archivos de audio mediante la creación de un AVMutableCompositionTrack después de añadir los dos archivos y exportación de la composición usando exportAsynchronouslyWithCompletionHandler método de AVAssetExportSession.

Consulte los enlaces a continuación para obtener más detalles.

AVAssetExportSession Class Reference

Creating New Assets

Espero que esto ayude a resolver su problema.

+0

Esta respuesta, aunque no es totalmente completa, definitivamente me puso en el camino correcto cuando se me ocurrió este mismo problema. – kermitology

+0

Agregué el código completo a continuación, pero fue esta respuesta la que me apuntó en la dirección correcta. – memmons

+0

@siddharth ¿De dónde sacaste la documentación @ disanji.net? Parece una copia de los documentos de Apple, pero no veo esa sección en los documentos oficiales de Apple. – memmons

6

Esto se puede hacer bastante fácilmente usando AVMutableComposionTrack insertTimeRange:ofTrack:atTime:error. El código es algo extenso, pero es realmente como 4 pasos:

// Create a new audio track we can append to 
AVMutableComposition* composition = [AVMutableComposition composition]; 
AVMutableCompositionTrack* appendedAudioTrack = 
    [composition addMutableTrackWithMediaType:AVMediaTypeAudio 
          preferredTrackID:kCMPersistentTrackID_Invalid]; 

// Grab the two audio tracks that need to be appended 
AVURLAsset* originalAsset = [[AVURLAsset alloc] 
    initWithURL:[NSURL fileURLWithPath:originalAudioPath] options:nil]; 
AVURLAsset* newAsset = [[AVURLAsset alloc] 
    initWithURL:[NSURL fileURLWithPath:newAudioPath] options:nil]; 

NSError* error = nil; 

// Grab the first audio track and insert it into our appendedAudioTrack 
AVAssetTrack *originalTrack = [originalAsset tracksWithMediaType:AVMediaTypeAudio]; 
CMTimeRange timeRange = CMTimeRangeMake(kCMTimeZero, originalAsset.duration); 
[appendedAudioTrack insertTimeRange:timeRange 
          ofTrack:[originalTrack objectAtIndex:0] 
          atTime:kCMTimeZero 
           error:&error]; 
if (error) 
{ 
    // do something 
    return; 
} 

// Grab the second audio track and insert it at the end of the first one 
AVAssetTrack *newTrack = [newAsset tracksWithMediaType:AVMediaTypeAudio]; 
timeRange = CMTimeRangeMake(kCMTimeZero, newAsset.duration); 
[appendedAudioTrack insertTimeRange:timeRange 
          ofTrack:[newTrack objectAtIndex:0] 
          atTime:originalAsset.duration 
           error:&error]; 

if (error) 
{ 
    // do something 
    return; 
} 

// Create a new audio file using the appendedAudioTrack  
AVAssetExportSession* exportSession = [AVAssetExportSession 
             exportSessionWithAsset:composition 
             presetName:AVAssetExportPresetAppleM4A]; 
if (!exportSession) 
{ 
    // do something 
    return; 
} 


NSString* appendedAudioPath= @""; // make sure to fill this value in  
exportSession.outputURL = [NSURL fileURLWithPath:appendedAudioPath]; 
exportSession.outputFileType = AVFileTypeAppleM4A; 
[exportSession exportAsynchronouslyWithCompletionHandler:^{ 

    // exported successfully? 
    switch (exportSession.status) 
    { 
     case AVAssetExportSessionStatusFailed: 
      break; 
     case AVAssetExportSessionStatusCompleted: 
      // you should now have the appended audio file 
      break; 
     case AVAssetExportSessionStatusWaiting: 
      break; 
     default: 
      break; 
    } 
    NSError* error = nil; 

}]; 
Cuestiones relacionadas