動画エンコード

二ヶ国語音声対応

昨年の二ヶ国語音声対応では日本語/英語それぞれ2chステレオを確保した2トラックに対して全てMAPオプションで列挙する事で多国語対応したのだが、『きかんしゃトーマス』がL/Rを日本語/英語に置き換えたモノラル2カ国語フォーマットで聞きづらいので、これもL/Rを分離してモノラルマルチトラックとする事に。

要は"channelsplit[FL][FR]“で分離して -map “[FL]” -map “[FR]” すれば良いという事なので、 ~/bin/stereo2bilingual.sh

#!/bin/bash
TMPFIL=$$.mp4
# IN_FILES="${1:-*.mp4}";
IN_FILES=$*
for f in ${IN_FILES}; do
    ffmpeg -i ${f} \
      -filter_complex "channelsplit[FL][FR]" -map "0:v" -map "[FL]" -map "[FR]" \
      -metadata:s:a:0 language=jpn -metadata:s:a:1 language=eng \
      -c:v copy ${TMPFIL};
    mv ${f} ${f}.origin;
    mv ${TMPFIL} ${f};
    touch --reference=${f}.origin ${f};
done

というスクリプトを書いて録画済みの『きかんしゃトーマス』をコンバート。jpn/engをmetadataとして入れるのもポイントだ。

今後の録画エンコードについては~/bin/get_stream_map.plにchannelsplit対応を追加した~/bin/get_audio_parameter.plを作成。ストリームからステレオ/多国語の判断はできそうにないので、ファイル名に【二】が入っているかどうかとして、着地。

参照

82.hatenablog.com http://82.hatenablog.com/

ニコラボ https://nico-lab.net/

FFmpeg https://ffmpeg.org/

Wikipedia https://ja.wikipedia.org/wiki/

サラウンド音声対応

二ヶ国語音声対応で薄々気付いていたのだが、3D再生とサラウンドの対応が片付いたので、MPEG-4 AVC(H.264)トランスコードのサラウンド対応に本腰を入れる事に。

と言っても、取り敢えずAudio CODECをAACからドルビーAC-3に変更、チャンネル数を6にするだけで良い事がわかった。

# OPT_ACODEC="-acodec **aac -ac 2** -ar 48000 -ab 128k"
OPT_ACODEC="-acodec ac3 -ac 6 -ar 48000 -ab 128k"

AACの6CHだと2チャンネル環境のVLCでは音が出ないので、ドルビーAC-3にするのが肝要。

ソースが2chステレオか6ch(5.1ch)サラウンドなのかの判断について悩み中なのだが、ドルビーAC-3では2chステレオのソースを6ch(5.1ch)にエンコードしても問題無いので、取り敢えず全部6chでいいか。

参照

Wikipedia https://ja.wikipedia.org/wiki/

ARIB B25復号処理

二ヶ国語音声対応の問題で、録画したTSファイルを調べててARIB STD-B25の復号(descramble)に失敗しているものがある事に気付いた。

gt110bMB直結&ケース内蔵にしたB-CASカードの接触不良と推察し、手作業でb25コマンドを叩いていたのだが、よく考えたらB-CASカード1枚では同時に復号できるのは3番組が限界なので、4つ以上の番組録画が重なった場合に足りなくなる事が判明。

…かと言って、B-CASカードリーダを2セットも用意するのもバカらしいので、recpt1ではひとまずscramble状態のまま受信しておいて、別途一つずつファイルを順次descrambleするのが賢いと気づいた。

というわけで、/var/www/html/epgrec/do-record.shを弄ってrecpt1の–b25オプションを削除し、/var/www/html/epgrec/config.phpで定義しているepgrec録画ファイルの拡張子を.tsから.arib25に変更。

~~~
$RECORD_MODE = array(
    // ※ 0は必須で、変更不可です。
    0 => array(
        'name' => 'Full TS',    // モードの表示名
        'suffix' => '.arib25',  // ファイル名のサフィックス
    ),
    1 => array(
        'name' => 'Minimum TS', // 最小のTS
        'suffix' => '.arib25',  // ファイル名のサフィックス
    ),
    /* Example is as follows.
    2 => array(
        'name' => '12Mbps MPEG4',
        'suffix' => '.avi',
    ),
    */
);
~~~

録画完了時に.arib25ファイルを/var/www/html/epgrec/recording(GUI設定値)から/var/www/html/epgrec/recordedに移動するよう/var/www/html/epgrec/recorder.phpも変更。

305         $decodefile = INSTALL_PATH ."/recorded/" . $rrec->path;
306         rename(INSTALL_PATH .$settings->spool . "/". $rrec->path, $decodefile);
307         reclog( "recorder:: 予約ID". $rrec->id .":".$rrec->type.$rrec->channel.$rrec->title."のB25復号準備" );

b25コマンドを回して.arib25から.tsを出力するcronを作成。

二ヶ国語音声対応

久々に動画エンコードの件。

Dlife/ディーライフ ロゴ

Dlife/ディーライフより

Dlife/ディーライフでオンエアしているミッキーマウスとロードレーサーズだが、放送波では日本語と英語の二ヶ国語放送なのに、MPEG-4 AVC(H.264)にトランスコードしたファイルによって日本語だったり英語だったりしている事に気付いた。

2か国語放送の仕組みとしてはアナログ放送時代から伝統的にステレオのL/Rを日本語/英語に置き換えたモノラル2カ国語が一般的なのだが、BSデジタル放送なディーライフの場合は日本語/英語それぞれ2chステレオを確保した2トラック(ストリーム)の構成となっているので、音声トラックが期待通りに選択されていないようだ。

「結果オーライで日本語が選択される期待だったのになぁ…」と思いつつ、現行の~/bin/get_stream_map.plをチェックしたところ、ビットレートの高いストリームが選ばれるようになっているのに気付いた。これは地上波デジタル放送をトランスコードするケースで低解像度なワンセグデータに惑わされないように、複数ストリームが含まれる場合にビットレートの一番高いストリームに着目するという処理を入れたのが安直過ぎ(考慮不足)で、結果的にAudioでは日本語か英語かが気まぐれでチョイスされてしまった模様。

そもそも、多言語音声は再生時に選択可能であるべきなので、Audioはビットレート100kbps以上の音声ストリームを全てMAPオプションで列挙する事で、MPEG-4 AVC(H.264)ファイルに複数音声トラックが取り込まれるように改修。

参照

82.hatenablog.com http://82.hatenablog.com/

Dlife/ディーライフ https://dlife.disney.co.jp/

Wikipedia https://ja.wikipedia.org/wiki/