春雨日記 about me tags

いつの間にかconfigの中にenc-enhance.jsなる物が増えている事に気づきました

字幕や2チャンネル音声に対応したりしていて面白そうだったので有効にしてみる物の動かず…

はじめに

というわけで,使えるようにしていきます.

結論から言うと,私の環境ではffmpegにaribb24が組み込まれていないためでした.

有効にしたものを作成しようと思います.

なお,ArchでやってるのでPKGBUILDとか出てきますが,手で打てば他のディストリでも大丈夫だと思います.

PKGBUILD修正

修正がこちら

https://git.haru3.me/haru/ffmpeg-aribb24/commit/34f7bdc14a9911667e78fa52c64b421838e347f4

このレポジトリをcloneしてmakepkg -siで導入できます.

まあ2行増やしただけですが…

ていうかarchにもaribb24ライブラリメンテナンスしてくれる方がいるんですね.感謝…

動作確認

config.jsにenc-enhance.jsのオプションを追加します.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
encode:
    - name: 'H.264'
      cmd: '%NODE% %ROOT%/config/enc.js'
      suffix: .mp4
      rate: 4.0
    - name: 'H.264FHD'
      cmd: '%NODE% %ROOT%/config/enc-fhd.js'
      suffix: -fhd.mp4
      rate: 4.0
    - name: 'H.264ENH'
      cmd: '%NODE% %ROOT%/config/enc-enhance.js'
      suffix: -enh.mp4
      rate: 4.0

私の設定はこんな感じ.fhdは無視してください.

そして動作

進捗が見えます.良いですね.

字幕OKですね.

2カ国語は放送してないので試してないですが,とりあえずこれで良しとしておきます.

しかし最近忙しすぎるわ…

追記

NHKのニュースで試したら2ヶ国語でコケるようです.

普通にc:a copyにしたほうがいいかも.

追記2

こんな感じでcopyにしました.

//変更:の所が変更点です.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
()
/**
 * 動画長取得関数
 * @param {string} filePath ファイルパス
 * @return number 動画長を返す (秒)
 */
const getDuration = filePath => {
    return new Promise((resolve, reject) => {
        execFile(ffprobe, ['-v', '0', '-show_format', '-of', 'json', filePath], (err, stdout) => {
            if (err) {
                reject(err);

                return;
            }

            try {
                const result = JSON.parse(stdout);
                resolve(parseFloat(result.format.duration));
            } catch (err) {
                reject(err);
            }
        });
    });
};

// 変更:エラーが出ないように
Array.prototype.push.apply(args, ['-fflags', '+discardcorrupt']);
Array.prototype.push.apply(args, ['-analyzeduration', '64M']);
Array.prototype.push.apply(args, ['-probesize', '64M']);

// 字幕用
Array.prototype.push.apply(args, ['-fix_sub_duration']);
// input 設定
Array.prototype.push.apply(args, ['-i', input]);
// ビデオストリーム設定
Array.prototype.push.apply(args, ['-map', '0:v', '-c:v', 'libx264']);
// インターレス解除
Array.prototype.push.apply(args, ['-vf', 'yadif']);

// 変更: dualmono周りの設定を削除

// 変更: copy Audio
Array.prototype.push.apply(args, ['-map', '0:a', '-c:a', 'copy']);
Array.prototype.push.apply(args, ['-absf', 'aac_adtstoasc']);

// 字幕ストリーム設定
Array.prototype.push.apply(args, ['-map', '0:s?', '-c:s', 'mov_text']);
// 品質設定
Array.prototype.push.apply(args, ['-preset', 'veryfast', '-crf', '22']);
// 出力ファイル
Array.prototype.push.apply(args, [output]);

(async () => {
    // 進捗計算のために動画の長さを取得
    const duration = await getDuration(input);
()

オリジナル: https://github.com/l3tnun/EPGStation/blob/master/config/enc-enhance.js.template