OBSのオーディオマルチトラック 収録について本気出して検証した
■まえがき
皆さんOBS使ってますか?
便利ですよね、OBS。
配信はもちろん、簡単な画像の作成や映像録画にも使えて、テレワーク用のプレゼンにも使える、、、こんな便利なものが無料で使えるんだからすごい。
ただ、困った点もあって、
マルチインプットを持つオーディオインターフェースでも1-2chしか認識できない
音声の収録がデフォルトだと非可逆圧縮の「aac」となる。
今回は、音声の収録をPCMで行おうとした際に起こった、Premiere ProとOBSのマルチトラック収録素材についての備忘録です。
ゴール地点は
「OBSでオーディオは高品質なPCM(に準じるもの)でマルチトラックレコーディングしつつ、映像は配信エンコーダーに不可のない状態で収録すること」
■OBSのマルチトラックの仕様(デフォルト時)
まず、OBSではマルチトラック収録が可能です。
OBS内部で保持しているステレオAUXが6本あり、配信にはそのAUXの1本を使用します。その他5本は録画用です。
なので、OBS内部ではモノ12チャンネルを扱えることになります。
ただし、これらをデフォルトでマルチトラック収録しようとすると、強制的に非可逆圧縮の「aac」となってしまいます。
■OBS+ffmpegのあわせ技
そこで出てくるのがカスタムエンコーダーを使う形です。
設定>出力>録画の中にある「種別」を「カスタム出力(ffmpeg)」に変更すると、ffmpegでのエンコード収録が可能になります。
「カスタム出力(ffmpeg)」を選択した状態にすると、下の方に出てくる「音声エンコーダ」でPCMが選べるようになります。
大量にPCMがあるのですが、選択すべきは
pcm_s16le(s16be)
└PCM signed 16bit LittleEndianpcm_s24le(s24be)
└PCM signed 24bit LittleEndian
の2つを選べば無難です。
普段良く目にするWAV(PCM)と同じになります。
※RIFF形式(WAV/AIFF)の音声は大きく分けて
・WAV-リトルエンディアン
・AIFF-ビッグエンディアンになるのですが、
それぞれのデータの中身が4バイトのチャンク名、4バイトのチャンク長、データ本体となっており、この4バイトのチャンク長の種類がビッグエンディアンと呼ばれるものか、リトルエンディアンと呼ばれるものに分かれている、とだけ覚えておいておけば大丈夫です。
■そうすると今度はPremiere Proが…
上の設定で
・カスタム出力(ffmpeg)
・PCM
で収録することはできるようになりましたが、重大な仕様があります。
ここでPCMマルチトラックで収録した映像データ(MOV)が、Adobe系のアプリケーションで読み込ませるとステレオとして1-2chしか認識しません。
※AACで収録すると、カスタム出力だろうとデフォルトだろうが1−12chすべて認識します。
ここでドハマりました。
■実は中ではちゃんとマルチトラックになってる
「どうして!?」となって色々と調べました。
下記が、OBSでマルチトラックPCMで収録したデータ(MOV)を各アプリケーションで確認した挙動です。
Premiere Pro:ステレオ
Audition:ステレオ
Pro Tools:ステレオ6トラック
DaVinci Resolve:ステレオ6トラック
MediaInfo:ステレオ6トラック
Handbrake:ステレオ6トラック
VLC:ステレオ6トラック
ffmpeg:ステレオ6トラック
■[超重要]なぜ?>コンテナがMP4じゃなかったから
そんな中、ネットの海を漂っていたところ、答えがありました。
つまり、汎用性が高いだろうと踏んでいた「H.264 MOV」の仕様が変わり、Adobeがきっちりその仕様に沿ったアプリケーションを開発していたため、OBSで作られた「マルチトラックのH.264 MOV」(仕様に準拠していないファイル)を弾いていたということでした。
■対応策
これにより対応策が絞られます。
OBS収録時にコンテナMOV、コーデックProRes、PCMマルチトラックで収録する
▼メリット:Premiere Proで直接読み込むことができる
▼デメリット:ファイルサイズが莫大になる
デメリットの対応策として、カスタム解像度を使って1x1 pxの動画データを作る。それでもPCMのオーディオデータが非圧縮なのでファイルサイズが肥大化する。
※ProResはビットレートが固定になるので解像度でデータを減らすしかないOBS収録時にコンテナMP4、コーデックh.264、AACマルチトラックで収録する
▼メリット:Premiere Proで直接読み込むことができる
▼デメリットとしては音声がAACになるOBS収録時にコンテナMOV、コーデック任意、PCMマルチトラックで収録。何らかの方法(ffmpeg、ProTools、DaVinci Resolve等)でオーディオを分ける
▼メリット:Adobe以外のアプリで音声を分離することが前提なので好き勝手できる(PCMをApple LosslessやFLACにしたりなど)。
▼デメリット:ひと手間かかる上、適当にコーデック選ぶとハードウェアリソースを食う
対応策用のffmpeg コマンド
ffmpeg -i --YOUR_MULTIAUDIO_FILES.MOV \
-map 0:1 -vn -acodec copy --YOUR_OUTPUT_audio001.wav \
-map 0:2 -vn -acodec copy --YOUR_OUTPUT_audio002.wav \
-map 0:3 -vn -acodec copy --YOUR_OUTPUT_audio003.wav \
-map 0:4 -vn -acodec copy --YOUR_OUTPUT_audio004.wav \
-map 0:5 -vn -acodec copy --YOUR_OUTPUT_audio005.wav \
-map 0:6 -vn -acodec copy --YOUR_OUTPUT_audio006.wav \
■ちなみに
いっそffmpeg(CUI)で分割することが前提ならPCMのバカみたいにでかいファイルじゃなくて可逆圧縮使えば良いのでは?
ということに気づいてしまったので自分は下記のワークフローでやってます。
コンテナ:MOV
映像コーデック:ProRes(エンコーダーはprores_ks)*1
映像解像度:1x1 px
音声コーデック:ALAC(エンコーダーはalac_at) *2
ファイルサイズ:12ch6トラック収録時、1分で概ね26MB
CPU負荷:M1 MacBook Pro で概ね4〜5%の負荷上昇。これは環境や読み込むソースによって異なるのであまり当てにならないかも
※1〜h.264の場合、偶数ピクセル(16画素)が必要なのとQuick LookでモタつくのでProRes。
※2〜「alac」は48k/24bit,「alac_at」は48k/16bit。最終的にffmpegに読み込んでパラで書き出す時は「.m4a」にする
以上
マルチトラックファイル、OBS、ffmpeg、Premiere Proに関する備忘録です。