2017-05-11 4 views
1

2つのオーディオトラックを1つにミックスしようとしています(ビデオのサウンドと音楽)。 AVFoundationでiOS - 2つのオーディオファイルを混ぜる

私はこの方法でビデオファイルへの2つのトラックを設定することができます:あなたは

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 

:ここ

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

は私のコンピュータ上のffmpegで検査結果出力ファイルですファイルに2つのオーディオトラックが含まれていることがわかります。私は2つのトラックを1つにマージする必要があります。なぜなら、一部のプレイヤーは最初のトラックのみをプレイするからです。

2つのトラックではなく、1つのトラックにのみミックスできますか?

ありがとうございます!すべてのヘルプはこのコードがダウンして一つにオーディオトラックをマージし

答えて

1

をいただければ幸いです - 私はAVMutableComposition(とない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

私たちは、私がAVAssetExportPresetPassthroughを使用することを除いて同じことを行いますAVAssetExportPresetHighestQualityの代わりに。あなたのプリセットでは、2つのトラックを1つにマージするようですね、ありがとう! 私のプリセットを使用して2つのオーディオトラックを作成することを確認できますか?前もって感謝します ! – Xys

+0

'AVAssetExportPresetPassthrough'を使用しても全く動作しません... –

+0

これは問題だと思います。どうもありがとう ! – Xys

関連する問題