Nakajijapan

生きるのに必死です。

AVAudioMixでオーディオの調節を行う

先日、心霊動画アプリ「もう一度ご覧いただこう」のアップデートしました。 その修正内容を書き綴ろうと思います。この動画アプリでは、録画した動画の同じタイムライン上にナレーションが入るのですが、あまりに録画した動画がにぎやかすぎるとナレーションがほとんど聞き取れない問題がありました。 対策としては、ナレーションの音声はそのままにして録画した動画の音声を小さくするように調整すること。AVAudioMixAVMutableAudioMixInputParametersをうまく利用することで解決しました。

実装

基本的には対象のメディア情報に対して、オーディオを制御する用のAVMutableAudioMixInputParametersを利用します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
AVMutableComposition avComposition;

(snip)

// movie sound
AVMutableCompositionTrack* compositionAudioTrack = [avComposition addMutableTrackWithMediaType:AVMediaTypeAudio
                                                                              preferredTrackID:kCMPersistentTrackID_Invalid];



// オーディオのメディア情報をもとにオーディオミックス用のパラメータを生成する
AVMutableAudioMixInputParameters *mixInputParameters = [AVMutableAudioMixInputParameters
                                                        audioMixInputParametersWithTrack:audioTrack];

// 音量の調整
[mixInputParameters setVolumeRampFromStartVolume:0.2f toEndVolume:0.2f
                                  timeRange:CMTimeRangeMake(kCMTimeZero, videoAsset.duration)];


// 入力パラメータをオーディオミックスに渡す。
mutableAudioMix = [AVMutableAudioMix audioMix];
mutableAudioMix.inputParameters = @[mixInputParameters];

– (BOOL)getVolumeRampForTime:(CMTime)time startVolume:(float )startVolume endVolume:(float )endVolume timeRange:(CMTimeRange *)timeRange

これでどの時間からどのくらいの間、音量をどのくらいにするのかの設定を行えるので、ここでその制御を行います。自分の場合はずっと音量を低くできればよかったので上記のような設定になっています。

1
2
3
4
5
6
AVAssetExportSession *assetExportSession;

(snip)

// 音声の制御
assetExportSession.audioMix = mutableAudioMix;

設定が終われば、AVAssetExportSessionaudioMixに格納すれば、設定が反映されているはずです。 これでナレーションが動画がうるさくてもしっかり聞こえるようになったので、よりテレビ番組のような感じに近づけられたかと思います!!!

Resources