【Windows】EPGStationでQSVEncCを使う【2019年9月版】

自宅サーバー

まとめメモです

LinuxでEPGStation+ffmpeg+QSVエンコードの設定は検索すれば出てきますが、
「Windows」でEPGStation+QSVエンコードの設定はなかなかなかった(あったけどenc.sh版だったり)ので、
まとめておきます。まだ最適化されてはいないと思うので、今後いろいろと変えていくつもりです。

EPGStation
参考:https://github.com/l3tnun/EPGStation

環境

・マザーボード MSI J1900I
・CPU Intel Celeron J1900 (BayTrail-D) (2.00 GHz, Burst 2.40GHz,オンボード)
・メモリ DDR3 8GB
・OS Microsoft Windows 10 Pro (1903)

元々Ubuntuで構築していたが、廉価CPUはLinuxでのQSV利用に制限があるため、フルに使えるWindowsに乗り換えたのがきっかけ。
最初はffmpegでやってたものの、EPGStationからffmpeg叩いてQSVエンコードさせようとするとエラーが出て使えなかった。(QSVはD3D9を使うけど、ヘッドレスモードでffmpegを動かすためにはD3D11が必要なのが原因?)
参考:https://trac.ffmpeg.org/ticket/7511

QSVEncCがとても優秀なのは聞いていたので、今回組み込んだ感じ。
参考:https://rigaya34589.blog.fc2.com/blog-category-10.html

Windows上にmirakurunとEPGStationをインストールする方法は別途検索してみてください。

一通り動いている前提で掲載します。

config.jsonの抜粋

    "mpegTsStreaming": [
        {
            "name": "720p",
            "cmd": "(QSVencCへのパス)\QSVencC64.exe -i - --avhw -c h264 --video-track 1 --audio-codec aac#dual_mono_mode=main --sub-copy asdata --audio-samplerate 48000 --audio-bitrate 192 --avsync vfr --max-procfps 90 --output-res 1280x720 --vbr 2000 --vpp-deinterlace bob --tff -f mpegts -o pipe:1"
        },
        {
            "name": "480p",
            "cmd": "(QSVencCへのパス)\QSVencC64.exe -i - --avhw -c h264 --video-track 1 --audio-codec aac#dual_mono_mode=main --sub-copy asdata --audio-samplerate 48000 --audio-bitrate 192 --avsync vfr --max-procfps 90 --output-res 720x480 --dar 16:9 --vbr 1200 --vpp-deinterlace bob --tff -f mpegts -o pipe:1"
        },
        {
            "name": "無変換"
        }
    ]
    "recordedHLS": [
        {
            "name": "720p",
            "cmd": "(QSVencCへのパス)\QSVencC64.exe -i %INPUT% --avhw -c h264 --video-track 1 -m hls_time:3 --gop-len 90 -m hls_list_size:17 -m hls_allow_cache:1 -m hls_segment_filename:%streamFileDir%/stream%streamNum%-%09d.ts --output-thread 0 --audio-codec aac#dual_mono_mode=main --sub-copy asdata --audio-samplerate 48000 --audio-bitrate 192 --avsync vfr --max-procfps 90 --output-res 1280x720 --vbr 2000 --vpp-deinterlace bob --tff -o %OUTPUT%"
        },
        {
            "name": "480p",
            "cmd": "(QSVencCへのパス)\QSVencC64.exe -i %INPUT% --avhw -c h264 --video-track 1 -m hls_time:3 --gop-len 90 -m hls_list_size:17 -m hls_allow_cache:1 -m hls_segment_filename:%streamFileDir%/stream%streamNum%-%09d.ts --output-thread 0 --audio-codec aac#dual_mono_mode=main --sub-copy asdata --audio-samplerate 48000 --audio-bitrate 128 --avsync vfr --max-procfps 90 --output-res 720x480 --dar 16:9 --vbr 1200 --vpp-deinterlace bob --tff -o %OUTPUT%"
        }
    ]
    "liveHLS": [
        {
            "name": "720p",
            "cmd": "(QSVencCへのパス)\QSVencC64.exe -i - --avhw -c h264 --video-track 1 -m hls_time:3 --gop-len 90 -m hls_list_size:17 -m hls_allow_cache:1 -m hls_segment_filename:%streamFileDir%/stream%streamNum%-%09d.ts --output-thread 0 --audio-codec aac#dual_mono_mode=main --sub-copy asdata --audio-samplerate 48000 --audio-bitrate 192 --avsync vfr --max-procfps 90 --output-res 1280x720 --vbr 2000 --vpp-deinterlace bob --tff -o %OUTPUT%"
        },
        {
            "name": "480p",
            "cmd": "(QSVencCへのパス)\QSVencC64.exe -i - --avhw -c h264 --video-track 1 -m hls_time:3 --gop-len 90 -m hls_list_size:17 -m hls_allow_cache:1 -m hls_segment_filename:%streamFileDir%/stream%streamNum%-%09d.ts --output-thread 0 --audio-codec aac#dual_mono_mode=main --sub-copy asdata --audio-samplerate 48000 --audio-bitrate 128 --avsync vfr --max-procfps 90 --output-res 720x480 --dar 16:9 --vbr 1200 --vpp-deinterlace bob --tff -o %OUTPUT%"
        },
        {
            "name": "180p",
            "cmd": "(QSVencCへのパス)\QSVencC64.exe -i - --avhw -c h264 --video-track 1 -m hls_time:3 --gop-len 90 -m hls_list_size:17 -m hls_allow_cache:1 -m hls_segment_filename:%streamFileDir%/stream%streamNum%-%09d.ts --output-thread 0 --audio-codec aac#dual_mono_mode=main --sub-copy asdata --audio-samplerate 48000 --audio-bitrate 64 --avsync vfr --max-procfps 90 --output-res 320x180 --vbr 192 --vpp-deinterlace bob --tff -o %OUTPUT%"
        }
    ],

 enc.jsの抜粋

const spawn = require('child_process').spawn;
const qsvencc = '(QSVencCへのパス)\QSVencC64.exe';

const input = process.env.INPUT;
const output = process.env.OUTPUT;

const videoHeight = parseInt(process.env.VIDEORESOLUTION, 10);
const isDualMono = parseInt(process.env.AUDIOCOMPONENTTYPE, 10) == 1;
const audioBitrate = videoHeight > 720 ? '192' : '128';

const cqp = '21:26:29';

// input 設定
const args =['-i', input];

// 動画設定(QSVencC)
Array.prototype.push.apply(args,['--avhw', '-c', 'h264', '--video-track', 1]);

// 音声設定(QSVencC)
Array.prototype.push.apply(args, ['--audio-codec']);

// dual mono 設定(QSVencC)
let audioCodec = 'aac';
if (isDualMono) {
    audioCodec += '#dual_mono_mode=main'
}
Array.prototype.push.apply(args, [audioCodec, '--audio-samplerate', 48000, '--audio-bitrate', audioBitrate]);
// デュアルモノエラー対策
Array.prototype.push.apply(args, ['--audio-ignore-decode-error', 30]);

// 字幕データコピー(QSVencC)
//Array.prototype.push.apply(args, ['--sub-copy', 'asdata']);

// 出力解像度 設定
if (videoHeight > 720) {
    Array.prototype.push.apply(args, ['--output-res', '1280x720']);
}

// その他設定
Array.prototype.push.apply(args,[
    '--cqp', cqp,
    '--avsync', 'vfr',
// インターレース解除(QSVencC)
    '--tff', '--vpp-deinterlace', 'bob',
    '-f', 'mp4',
    '-o',
    output
]);

let str = '';
for (let i of args) {
    str += ` ${ i }`
}
console.error(str);

const child = spawn(qsvencc, args);

child.stderr.on('data', (data) => { console.error(String(data)); });

child.on('error', (err) => {
    console.error(err);
    throw new Error(err);
});

process.on('SIGINT', () => {
    child.kill('SIGINT');
});

とりあえずは動いてる…けどまだまだだね

いろいろ試行錯誤した結果、字幕入りHLS配信も自動エンコードもうまく動いていますが、工夫したところとしては、

参考:https://github.com/rigaya/QSVEnc/blob/master/QSVEncC_Options.ja.md

  • –cqp
    Celeron J1900はvbr,cbr,cqpしか使えないのでcqp指定。
    数値は好みでどうぞ。上記例ではIPBで指定していますが、

    --cqp 23

    みたいに指定することも可能。

  • –audio-ignore-decode-error 30
    デュアルモノの動画の場合、最初の解析に失敗するのか、エラーでエンコードできないことがあったので、デコードエラーを30件まで無視する設定に。(デフォルトは10)
  • –vpp-deinterlace bob
    完全に趣味の部分ですが、ヌルヌル動く動画が好きなのでbob指定にしていますが、処理するフレーム数が倍になるので普通はnormal指定のほうがいいと思います。

以上の設定で、60fpsの動画を82fpsくらいでエンコードしてくれてます。(約1.3倍)
ちなみにインタレ解除をnormalに97fpsくらいでした。(約1.6倍)

・・・悩みどころ。

最後になりましたが、各ソフトウェアの制作者の皆様には感謝です。

コメント

タイトルとURLをコピーしました