2012-04-16 14 views
6

Próbuję połączyć 4 ścieżki dźwiękowe z jedną kompozycją, a następnie wyeksportować tę kompozycję do pliku. Do tej pory mój plik został pomyślnie utworzony, ale wszystkie ścieżki audio odtwarzane są z pełną głośnością, a nie z poziomu głośności, który próbuję ustawić. Oto, co robię teraz:Ustawianie poziomów śladów na 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:^{ ... }]; 

Jedyną interesującą rzeczą jest metoda audioParamsForTrack, który jest tutaj:

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

    return [audioInputParams copy]; 
} 

ktoś może dostrzec to, co robię źle? Próbowałem przekazywać różne rodzaje ścieżek, aby utworzyć parametry audio, ale nie wydaje się to mieć znaczenia. Widziałem coś o preferowanej objętości utworu - czy to jest coś, co może mi pomóc? Trochę utknąłem w tej chwili, każda opinia jest doceniana!

+0

niekoniecznie jest to odpowiedź na twoje pytanie, ale powiązanymi, można ustawić wiele razy na pojedynczym obiekcie AVMutableAudioMixInputParameter. aby ustawić rampę w górę iw dół na tej samej ścieżce, musisz ustawić te rampy na tej samej instancji parametrów. Na początku tego nie rozumiałem i uważałem, że muszę dodać jeden obiekt Parameters na rampę objętości. – wbarksdale

Odpowiedz

1

Podczas debagowania mogę zobaczyć problem, ale nie jestem pewien, dlaczego tak się dzieje.

Po dodaniu params do tablicy, tak:

[inputParams addObject:audioParams]; 

id utwór zostaje ustawiony na 0, a więc nigdy nie przywiązuje do dowolnego utworu:

Z konsoli:

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

Rozwiązałem to, nie używając metody audioParamsForTrack, ale wykonując pracę tuż przed tablicą, tak:

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

miałem podobny problem, ale co pracował dla mnie było Ustawianie identyfikatora ścieżki wyraźnie od parametrów wejściowych:

[audioInputParams setTrackID:compositionAudioTrack.trackID]; 
+1

To mi się udało. Po prostu upewnij się, że ustawiasz trackID pochodzący z klasy CompositionAudioTrack, a NIE AVAssetTrack, jeśli dotyczy. – manderson

Powiązane problemy