EPGStationでRaspberry Piのハードウェアエンコードを使うための設定

 EPGStationは録画後のエンコード、放映中の番組のライブ視聴、録画済みの番組のストリーミング再生、エンコード済みの番組のストリーミング再生をffmpegで行っているが、CPUパワーの低いRaspberry Piの場合、ライブ視聴やストリーミング再生は基本的に無理があるし、録画後のエンコードにもかなりの時間がかかる。
 そこでwebm以外で使われている映像コーデックのlibx264をRaspberry Piのハードウェアエンコード機能を使うh264_omxに置き換え、
Raspberry Piには重たい処理となるインターレース解除を無効化、低解像度への変更を行う。

 configディレクトリのconfig.yml(v1の場合はconfig.json)のwebm以外の480pの設定を元に360pの設定を作成して、ハードウェアエンコードを使うために「-c:v libx264」を「-c:v h264_omx」に変更、ハードウェアエンコード使用時に使えない「-preset veryfast」、「-crf 23」、「-profile:v baseline」、「-tune fastdecode,zerolatency」があれば削除、インターレース解除を無効化して、低解像度にするために「-vf yadif,scale=-2:480」を「-vf scale=640:360 -aspect 16:9」に変更、低解像度に合わせて映像ビットレートを低くするために「-b:v 1500k」(または「-vb 1500k」)を「-b:v 1000k」に変更する(無ければ追加する)。

 さらに処理を軽くする場合は、解像度を360pから180pに落として「640:360」を「320:180」に変更するとか、解像度の変更を無効化するために「-vf scale=640:360 -aspect 16:9」を削除して、解像度に合わせて映像ビットレートを高くするために「-b:v 1000k」を「-b:v 3000k」に変更するとか、音声のエンコードを無効化するために「-c:a aac」を「-c:a copy」に変更して、「-bsf:a aac_adtstoasc」を追加して、「-dual_mono_mode main」、「-ar 48000」、「-b:a 128k」(もしくは「-ab 128k」)、「-ac 2」があれば削除するとかを適宜行う。

 録画後のエンコードはconfigディレクトリのenc.jsを同様に変更する。ハードウェアエンコードを使うために「const codec = 'libx264';」を「const codec = 'h264_omx';」に変更、ハードウェアエンコード使用時に使えない「'-preset', preset,」の行を削除して、「'-crf', crf,」を「'-vb', '1000k',」に変更、インターレース解除を無効化して、低解像度にするために「Array.prototype.push.apply(args, ['-vf', videoFilter]);」を「Array.prototype.push.apply(args, ['-vf', 'scale=640:360']);」に変更、低解像度に合わせて音声ビットレートも低くするために「const audioBitrate = videoHeight > 720 ? '192k' : '128k';」を「const audioBitrate = '128k';」に変更する。

 さらに処理を軽くする場合は、解像度を360pから180pに落として「640:360」を「320:180」に変更するとか、解像度の変更を無効化するために「Array.prototype.push.apply(args, ['-vf', 'scale=640:360']);」の行を削除して、解像度に合わせて映像ビットレートを高くするために「'-vb', '1000k',」を「'-vb', '3000k',」に変更するとか、音声のエンコードを無効化するために「Array.prototype.push.apply(args, ['-dual_mono_mode', dualMonoMode]);」の行を削除して、「'-c:a', 'aac',」を「'-c:a', 'copy',」に変更して、「'-ar', '48000',」を「'-bsf:a', 'aac_adtstoasc',」に変更して、「'-ab', audioBitrate,」の行を削除して、「'-ac', '2',」の行を削除するとかを適宜行う。