2017-05-11 3 views
1

Ich versuche, 2 Audiospuren in einen zu mischen (Video-Sound und etwas Musik).iOS - Mischen von zwei Audiodateien

Mit AVFoundation ich zwei Spuren in eine Videodatei mit dieser Methode einstellen:

https://stackoverflow.com/a/16316985/5120292

Hier ist das Ergebnis der Ausgabedatei, inspiziert mit ffmpeg auf meinem Computer: Sie

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'IMG_3789.mp4': 
    Metadata: 
    major_brand  : mp42 
    minor_version : 1 
    compatible_brands: mp41mp42isom 
    creation_time : 2017-05-11T15:46:52.000000Z 
    Duration: 00:00:22.63, start: 0.000000, bitrate: 38210 kb/s 
    Stream #0:0(und): Video: h264 (Baseline) (avc1/0x31637661), yuv420p, 1696x848, 37782 kb/s, 29.97 fps, 29.97 tbr, 90k tbn, 180k tbc (default) 
    Metadata: 
     creation_time : 2017-05-11T15:46:52.000000Z 
     handler_name : Core Media Video 
    Stream #0:1(und): Audio: aac (LC) (mp4a/0x6134706D), 44100 Hz, stereo, fltp, 250 kb/s (default) 
    Metadata: 
     creation_time : 2017-05-11T15:46:52.000000Z 
     handler_name : Core Media Audio 
    Stream #0:2(und): Audio: aac (LC) (mp4a/0x6134706D), 48000 Hz, stereo, fltp, 189 kb/s (default) 
    Metadata: 
     creation_time : 2017-05-11T15:46:52.000000Z 
     handler_name : Core Media Audio 

kann sehen, dass die Datei zwei Audiospuren enthält. Ich müsste die beiden Tracks zu einem zusammenführen, da einige Spieler nur den ersten Track spielen.

Ist es möglich, sie in nur eine Spur anstelle von 2 getrennten Spuren zu mischen?

Vielen Dank im Voraus! Jede mögliche Hilfe würde

Antwort

1

Dieser Code geht die Audiospuren nach unten in einem klar sein - ich glaube, das ist dank der AVMutableComposition (und nicht die AVAssetExportSession):

AVAssetTrack *videoTrack = ...; 
AVAssetTrack *audioTrack1 = ...; 
AVAssetTrack *audioTrack2 = ...; 

AVMutableComposition *composition = [AVMutableComposition composition]; 

for (AVAssetTrack* inputTrack in @[videoTrack, audioTrack1, audioTrack2]) { 
    AVMutableCompositionTrack* outputTrack; 
    outputTrack = [composition addMutableTrackWithMediaType:inputTrack.mediaType preferredTrackID:kCMPersistentTrackID_Invalid]; 

    NSError* error; 
    if (![outputTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, inputTrack.timeRange.duration) ofTrack:inputTrack atTime:kCMTimeZero error:&error]) { 
     NSLog(@"insertTimeRange error: %@", error); 
    } 
} 

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

NSURL *outputURL = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask][0] URLByAppendingPathComponent:@"output.mp4"]; 
[[NSFileManager defaultManager] removeItemAtURL:outputURL error:nil]; 

exportSession.outputFileType = AVFileTypeMPEG4; 
exportSession.outputURL = outputURL; 

[exportSession exportAsynchronouslyWithCompletionHandler:^{ 
    if (AVAssetExportSessionStatusCompleted == exportSession.status) { 
     NSLog(@"success %@", outputURL); 
    } else { 
     NSLog(@"failed %li", (long)exportSession.status); 
    } 
}]; 
+0

Wir tun das gleiche, außer dass ich AVAssetExportPresetPassthrough anstelle von AVAssetExportPresetHighestQuality. Es scheint, dass mit Ihrem Preset es die zwei Spuren in eins zusammenfasst, danke! Könnten Sie bitte bestätigen, dass mit meinem Preset 2 Audiospuren erstellt werden? Danke im Voraus ! – Xys

+0

Es funktioniert überhaupt nicht, wenn ich 'AVAssetExportPresetPassthrough' verwende ... –

+0

Okay, ich denke, das war das Problem. Danke vielmals ! – Xys