2012-04-16 14 views
6

Sto provando a combinare 4 tracce audio in una singola composizione, quindi esportare questa composizione in un file. Finora il mio file è stato creato con successo ma tutte le tracce audio vengono riprodotte a pieno volume invece dei livelli di volume che sto cercando di impostare. Qui è quello che sto facendo ora:Impostazione dei livelli di traccia su AVMutableComposition

AVMutableComposition *trackComposition = [AVMutableComposition composition]; 

AVAsset *asset1 = ... 
AVAsset *asset2 = ... 
AVAsset *asset3 = ... 
AVAsset *asset4 = ... 

NSMutableArray *inputParams = [NSMutableArray arrayWithCapacity:4]; 

// Add 4 tracks to composition (but only if there are no errors and the track isn't muted 
NSError *err; 
if(asset1 && ![self trackIsMuted:1]){ 
    AVAssetTrack *rawTrack = [[asset1 tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0]; 
    AVMutableCompositionTrack *compositionAudioTrack = [trackComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; 
    [compositionAudioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, [asset1 duration]) ofTrack:rawTrack atTime:kCMTimeZero error:&err]; 
    AVAudioMixInputParameters *audioParams = [self audioParamsForTrack:compositionAudioTrack volume:[self gainForTrack:1]]; 
    [inputParams addObject:audioParams]; 
} 
if(asset2 && !err && ![self trackIsMuted:2]){ 
    AVAssetTrack *rawTrack = [[asset2 tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0]; 
    AVMutableCompositionTrack *compositionAudioTrack = [trackComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; 
    [compositionAudioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, [asset2 duration]) ofTrack:rawTrack atTime:kCMTimeZero error:&err]; 
    AVAudioMixInputParameters *audioParams = [self audioParamsForTrack:compositionAudioTrack volume:[self gainForTrack:2]]; 
    [inputParams addObject:audioParams]; 
} 
if(asset3 && !err && ![self trackIsMuted:3]){ 
    AVAssetTrack *rawTrack = [[asset3 tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0]; 
    AVMutableCompositionTrack *compositionAudioTrack = [trackComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; 
    [compositionAudioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, [asset3 duration]) ofTrack:rawTrack atTime:kCMTimeZero error:&err]; 
    AVAudioMixInputParameters *audioParams = [self audioParamsForTrack:compositionAudioTrack volume:[self gainForTrack:3]]; 
    [inputParams addObject:audioParams]; 
} 
if(asset4 && !err && ![self trackIsMuted:4]){ 
    AVAssetTrack *rawTrack = [[asset4 tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0]; 
    AVMutableCompositionTrack *compositionAudioTrack = [trackComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; 
    [compositionAudioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, [asset4 duration]) ofTrack:rawTrack atTime:kCMTimeZero error:&err]; 
    AVAudioMixInputParameters *audioParams = [self audioParamsForTrack:compositionAudioTrack volume:[self gainForTrack:4]]; 
    [inputParams addObject:audioParams]; 
} 

AVMutableAudioMix *audioMix = [AVMutableAudioMix audioMix]; 
audioMix.inputParameters = inputParams; 

// Export the composition to a file 
AVAssetExportSession *export = [AVAssetExportSession exportSessionWithAsset:trackComposition presetName:AVAssetExportPresetAppleM4A]; 

NSURL *outputURL = [NSURL fileURLWithPath:[[NSTemporaryDirectory() stringByAppendingPathComponent:[NSString guidString]] stringByAppendingPathExtension:@"m4a"]]; 

[export setOutputURL:outputURL]; 
[export setOutputFileType:@"com.apple.m4a-audio"]; 

[export setAudioMix:audioMix]; 

[export exportAsynchronouslyWithCompletionHandler:^{ ... }]; 

L'unica altra cosa interessante è il metodo audioParamsForTrack, che è qui:

- (AVAudioMixInputParameters *)audioParamsForTrack:(AVAssetTrack *)track volume:(float)vol{ 
    AVMutableAudioMixInputParameters *audioInputParams = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:track]; 
    [audioInputParams setVolume:vol atTime:kCMTimeZero]; 

    return [audioInputParams copy]; 
} 

chiunque può individuare quello che sto facendo male? Ho provato a passare tutti i tipi di tracce diverse per creare i parametri audio, ma non sembra fare la differenza. Ho visto qualcosa sul volume preferito di una traccia - è qualcosa che potrebbe aiutarmi? Sono un po 'bloccato a questo punto, qualsiasi feedback è apprezzato!

+0

questo non è necessariamente una risposta alla tua domanda, ma il suo correlato, è possibile impostare più volte su un singolo oggetto AVMutableAudioMixInputParameter. quindi per impostare una rampa su e giù sulla stessa traccia è necessario impostare quelle rampe sulla stessa istanza dei parametri. All'inizio non l'ho capito e ho pensato di dover aggiungere un oggetto Parametri per rampa di volume. – wbarksdale

risposta

1

Durante il debug di questo, posso vedere il problema, ma non sono sicuro del motivo per cui sta accadendo.

Quando si aggiungono i params alla matrice, in questo modo:

[inputParams addObject:audioParams]; 

L'id pista viene impostato su 0, quindi non si attacca a qualsiasi traccia:

Dalla console:

<AVMutableAudioMixInputParameters: 0x16eab300, track ID = 0, volume mix: volume 0.010 at time 0.000> 

Ho risolto questo problema non utilizzando il metodo audioParamsForTrack, ma eseguendo il lavoro subito prima dell'array, ad esempio:

NSMutableArray *inputParams = [NSMutableArray arrayWithCapacity:4]; 

      AVMutableAudioMixInputParameters *audioInputParams = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:AudioTrack]; 
      [audioInputParams setVolume:.01f atTime:kCMTimeZero]; 

      AVAudioMixInputParameters *audioParams = audioInputParams; 
[inputParams addObject:audioParams]; 

      audioMix.inputParameters = inputParams; 
2

Ho avuto un problema simile, ma che cosa ha funzionato per me era l'impostazione della Id pista esplicitamente sui parametri di input:

[audioInputParams setTrackID:compositionAudioTrack.trackID]; 
+1

Questo ha fatto il trucco per me. Assicurati di impostare il trackId che proviene dalla composizione AudioTrack, NON l'oggetto AVAssetTrack, se applicabile. – manderson

Problemi correlati