Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[確認]NHK解説放送のmp4エンコード #244

Closed
simplelife0530 opened this issue Mar 2, 2019 · 19 comments
Closed

[確認]NHK解説放送のmp4エンコード #244

simplelife0530 opened this issue Mar 2, 2019 · 19 comments

Comments

@simplelife0530
Copy link

「H264」の設定で、tsからmp4へエンコードする際の現象です。

NHKの[解]がつく放送、例えば連続テレビ小説「まんぷく」や土曜ドラマ「みかづき」で、
解説付きでmp4ができてしまいます。
dual_mono_modeのオプションをなくせば、通常の音声になります。
「H264-sub」でも解説付きになります。

解決策としては、通常はdual_mono_modeオプションなしでエンコード。[二]の時だけ「H264」を使うという方法ですが、みなさんはどう解決していますか?

@advancedbear
Copy link
Contributor

ffmpegの -dual_mono_mode オプションが正常に働くのは混合音声放送のみです。
Lチャンネルから主音声、Rチャンネルから副音声が出力されるような多重音声放送に対してのみ、-dual_mono_mode での音声分離が可能です。

    {"dual_mono_mode", "Select the channel to decode for dual mono",
     0x42, AV_OPT_TYPE_INT, {.i64=-1}, -1, 2,
     AACDEC_FLAGS, "dual_mono_mode"},
    {"auto", "autoselection",            0, AV_OPT_TYPE_CONST, {.i64=-1}, INT_MIN, INT_MAX, AACDEC_FLAGS, "dual_mono_mode"},
    {"main", "Select Main/Left channel", 0, AV_OPT_TYPE_CONST, {.i64= 1}, INT_MIN, INT_MAX, AACDEC_FLAGS, "dual_mono_mode"},
    {"sub" , "Select Sub/Right channel", 0, AV_OPT_TYPE_CONST, {.i64= 2}, INT_MIN, INT_MAX, AACDEC_FLAGS, "dual_mono_mode"},
    {"both", "Select both channels",     0, AV_OPT_TYPE_CONST, {.i64= 0}, INT_MIN, INT_MAX, AACDEC_FLAGS, "dual_mono_mode"},

FFmpeg: libavcodec/aacdec_template.c File Reference

一方で、昨今の地デジ・BS放送では番組のMPEG-TS内に複数のストリームを持たせることが出来るため、主音声・副音声を共に個別のステレオ音声として放送している場合が多いです。

以下に、3種類の多重音声放送番組における ffprobe の出力を例示します。


①ブラタモリ「127 パリの美」[解][字] [NHK総合1・名古屋] 2019年02月23日(土曜日)

Input #0, mpegts, from 'U:\ブラタモリ「#127 パリの美」[解][字] [NHK総合1・名古屋] 2019年02月23日(土曜日).ts':
  Duration: 00:45:03.44, start: 5424.392078, bitrate: 15806 kb/s
  Program 33792
    Metadata:
      service_name    : ?NHK?Am9g?1?L>8E20
      service_provider:
    Stream #0:0[0x100]: Video: mpeg2video (Main) ([2][0][0][0] / 0x0002), yuv420p(tv, bt709, top first), 1440x1080 [SAR 4:3 DAR 16:9], 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
    Stream #0:1[0x110]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 130 kb/s
    Stream #0:2[0x111]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 130 kb/s
    Stream #0:3[0x130]: Data: bin_data ([6][0][0][0] / 0x0006)
    Stream #0:4[0x138]: Data: bin_data ([6][0][0][0] / 0x0006)
    Stream #0:5[0x140]: Unknown: none ([13][0][0][0] / 0x000D)
    Stream #0:6[0x160]: Unknown: none ([13][0][0][0] / 0x000D)
    Stream #0:7[0x161]: Unknown: none ([13][0][0][0] / 0x000D)
    Stream #0:8[0x162]: Unknown: none ([13][0][0][0] / 0x000D)
    Stream #0:9[0x170]: Unknown: none ([13][0][0][0] / 0x000D)
    Stream #0:10[0x171]: Unknown: none ([13][0][0][0] / 0x000D)
    Stream #0:11[0x172]: Unknown: none ([13][0][0][0] / 0x000D)
  Program 33793
    Metadata:
      service_name    : ?NHK?Am9g?2?L>8E20
      service_provider:
  Program 34176
    Metadata:
      service_name    : ?NHK?7HBS?G?L>8E20
      service_provider:
  • Stream 0:1 と Stream 0:2 がそれぞれ主音声・副音声

②ゲゲゲの鬼太郎 45[字][多][デ]【真相は万年竹の藪の中】 [東海テレビ011] 2019年02月24日(日曜日)

Input #0, mpegts, from 'U:\ゲゲゲの鬼太郎 #45[字][多][デ]【真相は万年竹の藪の中】 [東海テレビ011] 2019年02月24日(日曜日).ts':
  Duration: 00:30:03.40, start: 39020.665422, bitrate: 14151 kb/s
  Program 3088
    Metadata:
      service_name    : El3$?|?011
      service_provider:
    Stream #0:0[0x111]: Video: mpeg2video (Main) ([2][0][0][0] / 0x0002), yuv420p(tv, bt709, top first), 1440x1080 [SAR 4:3 DAR 16:9], 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
    Stream #0:1[0x112]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 255 kb/s
    Stream #0:2[0x114]: Data: bin_data ([6][0][0][0] / 0x0006)
    Stream #0:3[0x115]: Data: bin_data ([6][0][0][0] / 0x0006)
    Stream #0:4[0x810]: Unknown: none ([13][0][0][0] / 0x000D)
    Stream #0:5[0x811]: Unknown: none ([13][0][0][0] / 0x000D)
    Stream #0:6[0x81a]: Unknown: none ([13][0][0][0] / 0x000D)
    Stream #0:7[0x816]: Unknown: none ([13][0][0][0] / 0x000D)
    Stream #0:8[0x81b]: Unknown: none ([13][0][0][0] / 0x000D)
    Stream #0:9[0x113]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 255 kb/s
  Program 3089
    Metadata:
      service_name    : El3$?|?012
      service_provider:
  Program 3090
    Metadata:
      service_name    : El3$?|?013
      service_provider:
  Program 3472
    Metadata:
      service_name    : El3$?|
      service_provider:
  Program 3095
    Metadata:
      service_name    : El3$?|NW;~
      service_provider:
  • Stream 0:1 と Stream 0:9 がそれぞれ主音声・副音声

③【緊急地震速報】2016年11月22日(火) 06時00分15秒.ts

Input #0, mpegts, from 'W:\【緊急地震速報】2016年11月22日(火) 06時00分15秒.ts':
  Duration: 00:14:59.93, start: 13239.187189, bitrate: 13751 kb/s
  Program 11264
    Metadata:
      service_name    : ?NHK?Am9g?1?H!4[
      service_provider:
    Stream #0:0[0x100]: Video: mpeg2video (Main) ([2][0][0][0] / 0x0002), yuv420p(tv, bt709, top first), 1440x1080 [SAR 4:3 DAR 16:9], 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
    Stream #0:1[0x110]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, mono, fltp, 85 kb/s
    Stream #0:2[0x138]: Data: bin_data ([6][0][0][0] / 0x0006)
    Stream #0:3[0x140]: Unknown: none ([13][0][0][0] / 0x000D)
    Stream #0:4[0x160]: Unknown: none ([13][0][0][0] / 0x000D)
    Stream #0:5[0x161]: Unknown: none ([13][0][0][0] / 0x000D)
    Stream #0:6[0x162]: Unknown: none ([13][0][0][0] / 0x000D)
    Stream #0:7[0x170]: Unknown: none ([13][0][0][0] / 0x000D)
    Stream #0:8[0x171]: Unknown: none ([13][0][0][0] / 0x000D)
    Stream #0:9[0x172]: Unknown: none ([13][0][0][0] / 0x000D)
    Stream #0:10[0x130]: Data: bin_data ([6][0][0][0] / 0x0006)
  Program 11265
    Metadata:
      service_name    : ?NHK?Am9g?2?H!4[
      service_provider:
  Program 11648
    Metadata:
      service_name    : ?NHK?7HBS?G?H!4[
      service_provider:
  Program 65520
  • Stream 0:1 が番組途中でL:主音声+R:副音声となる

上記の場合、①と②では -dual_mono_mode をmainに指定しようがsubに指定しようが、若番のストリームが取得されてトランスコードされます。
一方、③では -dual_mono_mode が正常に動作し、mainの場合は主音声が、subの場合は副音声がモノステレオとしてトランスコードされます。(すなわち、出力ファイルはステレオ音声となります)


連続テレビ小説「まんぷく」や土曜ドラマ「みかづき」のストリームがどのようになっているのか、私は録画していないため把握できませんが、ドラマがモノステレオ放送ということはないでしょうから、十中八九ステレオ音声の多重ストリーム放送でしょう。

この場合、正しく音声を分離したい場合は -dual_mono_mode ではなく、-map 0:a:[ストリーム番号] を用いるか、 -filter_complex channelsplit を用いるかの方法を取る必要があります。

@l3tnun
Copy link
Owner

l3tnun commented Mar 2, 2019

オーディオの簡易判定方法ですが

https://github.com/l3tnun/EPGStation/blob/master/doc/conf-manual.md#encode

にあるように. 環境変数 AUDIOCOMPONENTTYPE に Mirakurun から取得したオーディオ情報が格納されます。

AUDIOCOMPONENTTYPE2 の場合デュアルモノとなるのでその時だけ ffmpeg で dual_mono_mode オプションを使用するように修正しましょう。

AUDIOCOMPONENTTYPE の数値は https://github.com/rndomhack/node-aribts/blob/master/lib/event_table.jsaudioMode から来ていますので数値の意味はそちらで確認してください。

@l3tnun
Copy link
Owner

l3tnun commented Mar 2, 2019

enc.sh, enc.sh のデフォルトで dual_mono_mode オプションが有効というのは、あまり良くない実装ですね。
そのうち変更します。

@simplelife0530
Copy link
Author

advancedbearさん、詳しい解説ありがとうございます。

まんぷくをffprobeしたところ、新たな発見がありました。
なんとNHKBSプレミアムとNHK総合で、フォーマットが異なっていました。

Input #0, mpegts, from 'まんぷく128-2019-03-04.ts':
Duration: 00:15:02.69, start: 44515.815811, bitrate: 17395 kb/s
Program 103
Metadata:
service_name : ?~�����?|��ߢ�
service_provider: ?~���
Stream #0:0[0x100]: Video: mpeg2video (Main) ([2][0][0][0] / 0x0002), yuv420p(tv, bt709, bottom first), 1920x1080 [SAR 1:1 DAR 16:9], 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
Stream #0:1[0x110]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 192 kb/s
Stream #0:2[0x111]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 186 kb/s
Stream #0:3[0x130]: Data: bin_data ([6][0][0][0] / 0x0006)
Stream #0:4[0x138]: Data: bin_data ([6][0][0][0] / 0x0006)
Stream #0:5[0x140]: Unknown: none ([13][0][0][0] / 0x000D)
Stream #0:6[0x150]: Unknown: none ([13][0][0][0] / 0x000D)
Stream #0:7[0x160]: Unknown: none ([13][0][0][0] / 0x000D)
Stream #0:8[0x161]: Unknown: none ([13][0][0][0] / 0x000D)
Stream #0:9[0x162]: Unknown: none ([13][0][0][0] / 0x000D)
Stream #0:10[0x170]: Unknown: none ([13][0][0][0] / 0x000D)
Stream #0:11[0x171]: Unknown: none ([13][0][0][0] / 0x000D)

Input #0, mpegts, from 'まんぷく127-2019-03-02.ts':
Duration: 00:15:02.81, start: 38151.255378, bitrate: 15772 kb/s
Program 1024
Metadata:
service_name : ?NHK?Am9g?1�?El5~
service_provider:
Stream #0:0[0x100]: Video: mpeg2video (Main) ([2][0][0][0] / 0x0002), yuv420p(tv, bt709, top first), 1440x1080 [SAR 4:3 DAR 16:9], 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
Stream #0:1[0x110]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, mono, fltp, 144 kb/s
Stream #0:2[0x130]: Data: bin_data ([6][0][0][0] / 0x0006)
Stream #0:3[0x138]: Data: bin_data ([6][0][0][0] / 0x0006)
Stream #0:4[0x140]: Unknown: none ([13][0][0][0] / 0x000D)
Stream #0:5[0x160]: Unknown: none ([13][0][0][0] / 0x000D)
Stream #0:6[0x161]: Unknown: none ([13][0][0][0] / 0x000D)
Stream #0:7[0x162]: Unknown: none ([13][0][0][0] / 0x000D)
Stream #0:8[0x170]: Unknown: none ([13][0][0][0] / 0x000D)
Stream #0:9[0x171]: Unknown: none ([13][0][0][0] / 0x000D)
Stream #0:10[0x172]: Unknown: none ([13][0][0][0] / 0x000D)
Stream #0:11[0x111]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 144 kb/s
Stream #0:12[0x150]: Unknown: none ([13][0][0][0] / 0x000D)

NHKBSプレミアムでは、音声が2チャンネル、NHK総合では1チャンネルです。
NHKBSプレミアムでは、解説なしのmp4、NHK総合では解説つきmp4となりました。
つまり、[解]とついていても、挙動が異るのです。
NHK総合で、[解]の時は、dual_mono_modeを使わない、というのが解決策?でしょうか。

@advancedbear
Copy link
Contributor

advancedbear commented Mar 4, 2019

l3tnunさんが書かれたとおり、

AUDIOCOMPONENTTYPE が 2 の場合デュアルモノとなるのでその時だけ ffmpeg で dual_mono_mode オプションを使用するように

これが最善です。

解説放送をデュアルモノ音声にしているか、2ストリームとしているかは放送局に依るものではなく個々の放送に依るものですから、番組名や放送局で判断をしようというのが既に間違いです。


ちなみにですが、上記 AUDIOCOMPONENTTYPE についてはWebUIからも確認可能です。
image

@simplelife0530
Copy link
Author

ちょっと不思議なのは、NHK総合の朝と昼の「まんぷく」は、音声チャネル1でモノとffprobeではなっているのに、番組表では、音声2チャンネル、ステレオになっています。番組表が間違っているのでしょうか。

NHKBSプレミアムの朝の「まんぷく」は、音声チャネル2、ステレオとffprobeではなっており、番組表でも、音声2チャンネル、ステレオと合っています。

実際にffprobeで確認した内容が正しいとすれば、NHK総合の番組表の情報が、間違っていることになります。

そして、もう一つ気がついたのは、NHK総合の「まんぷく」というか、音声チャンネル1のモノの解説放送は、dual_mono_modeを設定してもしなくても、解説がとれないようです。

明日朝、もう一度確認してみます。

@simplelife0530
Copy link
Author

再度、NHK総合の「まんぷく」とNHKBSプレミアムの「まんぷく」を見たところ、違いがありました。

前者は、3秒ほど「まんぷく」の前のニュースが入っており、後者は、「まんぷく」だけで始まっていました。

そもそも同じmirakurunを使っているのに、NHK総合とNHKBSプレミアムで録画開始時間が変わるのも不思議ですし、ニュースのプロパティがそのまま「まんぷく」に流れ込むのも不思議です。

解説放送の問題ではなく、NHK総合の録画開始時間のズレが問題のようです。

ということで、解説放送の問題ではないので、クローズで良いと思います。

@advancedbear
Copy link
Contributor

そもそも同じmirakurunを使っているのに、NHK総合とNHKBSプレミアムで録画開始時間が変わるのも不思議ですし、ニュースのプロパティがそのまま「まんぷく」に流れ込むのも不思議です。

Mirakurunの問題ではなく、MPEG2-TSの仕様(+ffmpeg/ffprobeの仕様)です。
MirakurunはProgram単位でEITを解析するので、各番組個別の情報を所有しますが、ffprobeの解析はファイルの先頭から順次走査されるのでEITが変更されたタイミングでStreamが追加されます。

Stream #0:1[0x110]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, mono, fltp, 144 kb/s
Stream #0:11[0x111]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 144 kb/s

BSプレミアムのStreamにおいて、Stream0:11の音声がPID[0x111]となっていることにお気づきでしょうか。
俗に言う「わかさトラップ」などと同様の症状で、番組切り替わり時に起きるPIDの入れ替わりによって生じるffmpeg/ffprobeの問題です。

おはよう日本 まんぷく
主音声PID 0x110 (モノラル音声) 0x111 (ステレオ音声)
副音声PID なし 0x110 (ステレオ音声) *予想

ストリームの流れで見ると上記のような形になるため、ファイル先頭から読み出すffmpeg/ffprobeはPID[0x110]を第1音声ESと認識してトランスコードを行います。
一方で、MirakurunではProgram単位でPIDを認識するため、正しく表示されます。

TSSplitterなどで前番組との境目で分割したファイルをffprobeで読み直せば実態がよく分かるかと。

※これ以上はEPGStationやMirakurunの問題ではなく、ffmpeg/ffprobeの仕様とMPEG2-TSの仕様の話になるのでこの場で続けるのは不適切とも思いますが。

@simplelife0530
Copy link
Author

BSプレミアムのStreamにおいて、Stream0:11の音声がPID[0x111]となっていることにお気づきでしょうか。

こちらがNHK総合です。実は気がつかなかったのですが、Stream #0:11[0x111]: があったんですね。
これが問題なのはわかるのですが、このtsファイルが時間ぴったりの録画が始まれば、Stream #0:1[0x110]: はないはずだと思うのです。

さらに、NHKBSプレミアムでは、

Stream #0:1[0x110]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 192 kb/s
Stream #0:2[0x111]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 186 kb/s
では、前の番組が同じく朝ドラのため、ステレオで変わらず、解説のないエンコードになっているのでしょうか。

TSSplitterを必ず通してから行うのが確実なんでしょうが、前番組との境目より少し遅らせて録画する方が簡単なような気がします。

@advancedbear
Copy link
Contributor

こちらがNHK総合です。

失礼しました、自分で前番組が「おはよう日本」だと書いておきながらBSプレミアムと誤記してしまいました。


録画開始・終了のバッファについてはMirakurun側で設定可能です。
参考:https://github.com/Chinachu/Mirakurun/releases/tag/v2.0.0-rc.13

開始マージンを0にしたら音声ストリームの重複問題は改善はするかもしれませんが、プロセス立ち上がり+チューナーオープン等のラグを考えると、どう考えても頭切れするのではないかなと。


大本の話に戻りますが、Mirakurunの録画マージンを弄らずとも

AUDIOCOMPONENTTYPE が 2 の場合デュアルモノとなるのでその時だけ ffmpeg で dual_mono_mode オプションを使用する

を徹底していただければ

  • 前番組に関係なく録画対象番組がdual_monoかどうか判定可能
  • 対象番組がdual_monoの場合は -dual_mono_mode により主音声のみを取得可能
  • 対象番組がdual_monoでない場合は -dual_mono_mode を使用しないことにより、ffmpegは自動で主音声PIDを変換する

というようにほぼすべての問題が解決するはずです。

@simplelife0530
Copy link
Author

adbancedbearさん、いろいろありがとうございます。

再度、「まんぷく」の前番組がモノの場合で、-dual_mono_modeを付けずにffmpegを使用してみましたが、解説付きになってしまいました。

epgstationのデフォールトの設定の場合、
H264でエンコードする設定を使用すると、
前の番組が「シングルモノ」で、エンコードする番組が[解]の場合、解説付きのmp4ができる。
ということです。

これは、NHK総合で、「ニュース・気象情報」「みかづき」や「おはようニッポン」「まんぷく」で確認されています。

対象番組がdual_monoでない場合は -dual_mono_mode を使用しないことにより、ffmpegは自動で主音声PIDを変換する

ができれば、最適解なんですが、なぜか私のところでは再現できていません。

もう少し調査して、だめな場合はmirakurunの開始マージン0を選ぶことも考えます。

@advancedbear
Copy link
Contributor

advancedbear commented Mar 4, 2019

dual_mono_modeのオプションをなくせば、通常の音声になります。

ご自分で一番最初に答えを出してるのにどういう意味なんでしょう。

-dual_mono_modeなし -dual_mono_mode main -dual_mono_mode sub
挙動 前番組に関わらず主音声が選択 前番組の音声PIDを追従する 前番組の音声PIDを追従する
結果 通常音声でエンコードされる 解説音声でエンコードされる 解説音声でエンコードされる

EPGStationのenc.sh(またはenc.js)に記載のデフォルトエンコード設定はあくまでデフォルトであって基本的には

l3tnun commented on 10 Dec 2018
自由に書換えできますのでお好みに調整してあげてください。

l3tnun commented 2 days ago
…ffmpeg で dual_mono_mode オプションを使用するように修正しましょう。

ということです。

デフォルトのenc.shでは

$FFMPEG -dual_mono_mode $mode -i "$INPUT" -vf yadif -preset veryfast -c:v libx264 -crf 23 -f mp4 -s 1280x720 -c:a aac -ar 48000 -ab 192k -ac 2 "$OUTPUT"

のように、H264を選ぼうがH264-subを選ぼうが -dual_mono_mode が付加されますから、

なぜか私のところでは再現できていません。

はそもそも前提条件からして間違っています。

@advancedbear
Copy link
Contributor

もしかして、enc.shenc.js について、書き換えて利用してよいという事が周知されてない感じですかね?
仕様としてこんなパラメータになってるから直してください、という意味でのIssueなのであれば結論としては #244 (comment) だと思います。

考えてみれば、enc.shの中身を書き換えるような解説はdocにはないかもしれないですね。

@simplelife0530
Copy link
Author

advancedbearさん、

ちょっと違うかもしれないので、私の設定をお話します。

config.jsonを書き換え、3つのエンコードを入れています。
実際には、qsvでエンコードしますが、以下の3つです。
qsv dual_mono_modeなし
qsv-main dual_mono_mode main
qsv-sub dual_mono_mode sub
で、1番組に3つのエンコードを行ってみたのですが、
前番組「シングルモノ」で本番組「解説付き」の場合は、3つのモードで解説付きになってしまうのです。

別に、自分で書き換えればなんでもできますは、それでいいのですが、単にデフォールトの設定で、NHKのいくつかの番組が、予期せぬ解説付きになってしまいますよ、と言ってるだけなんです。

@simplelife0530
Copy link
Author

simplelife0530 commented Mar 4, 2019

すみません、もっと簡単に言うと、これdual_mono_modeには関係ない問題でした。

単に、「シングルモノ」「解説」の順に番組が続いた場合、ffmpegでエンコードすると「解説付き」のmp4ができるという話です。だから、これを回避するには、「シングルモノ」を入れないようにするか、ffmpegのオプションで回避するか、しか解決しないと思います。

それから、qsvが悪さしている可能性もあります。

@advancedbear
Copy link
Contributor

  • EPGStationとしては番組追従で予約する限りはMirakurun側の番組開始時間に従うだけ
  • Mirakurun側では maxBufferBytesBeforeReady で開始マージンを調整出来るが、変更は非推奨
  • ffmpegは音声ストリームが変動する場合、明示的にストリーム番号を指定しない限りファイル先頭におけるメインのPIDを用いる

といった条件が揃った結果ということですね。

EPGStationとしてのIssueはデフォルトの enc.sh-dual_mono_mode オプションは多くの場合無意味であるという点のみ というように見受けられます。

enc.sh にデフォルトで設定する、(多くの番組で問題の起きないエンコードが可能な)汎用性の高いffmpegのオプションについてを検討すべきですね。

@simplelife0530
Copy link
Author

advancedbearさん、

その通りです。

私は、NHKBSプレミアムで「まんぷく」を録画し、NHKの土曜ドラマはストリームを指定して再エンコードすれば、問題解決です。

@advancedbear
Copy link
Contributor

汎用性の高いffmpegエンコードオプションを探ろうと、数日前から私も朝のNHKドラマを録画してみたのですが、

  • 前番組デュアルモノ
  • 本番組ステレオ二重

という条件に合致していてもEPGStationデフォルトのエンコードオプションでは -dual_mono_mode の有無でエンコード結果に変わりはなく通常音声(=解説音声ではない)音源が出力されました。


1つ質問なのですが、qsvエンコードをする際に何か特別なオプションを入れていませんか?
例えば、-analyzeduration-probesize に極端に小さな値(10MのMが抜けているとか)を入れていたり、 -hwaccel オプションを指定したりしていませんか?
デコードや解析の時点で何かおかしい予感がします。


とはいえ、sub指定でも第二音声が出力されないデフォルトの enc.sh はおかしいので、継続して探る必要はありますが……。


デフォルトオプションの変更課題については別Issueを後ほど建て直そうかと思っています。
本スレッドは見通しが悪いので……。

@simplelife0530
Copy link
Author

advancedbearさん、

いろいろ調べていただきありがとうございます。

現在qsv-mainの設定は、以下の通り。

$FFMPEG -dual_mono_mode main -y -i "$INPUT" -init_hw_device qsv=hw -filter_hw_device hw -c:v h264_qsv -vf hwupload=extra_hw_frames=64,format=qsv -b:v 4M -maxrate 8M -acodec aac -loglevel error "$OUTPUT"

上記設定で、ほとんど問題なくmp4が作成できます。二ヶ国語も主音声になります。
問題は、今のところ、解説放送の前がモノの時だけです。

まず、これはepgstationの問題ではないので、ここでクローズにしたいと思います。

advancedbearさんのところで再現しない、さらに解説放送も抽出できないとのことですが、
さらに調査した結果、以下2つのことがわかりました。

(1)地デジとBSデジの違い
地デジでは、前の番組が3秒ほど映っていますが、BSデジでは、前の番組は映りません。
そのくらい開始のタイミングがずれています。これは、明らかにおかしい。
私の環境が、地上デジがJCOM、BSデジがアンテナ、という特殊な環境であることが影響している可能性が高い。

(2)「自分に負けないラボラトリ」さんの情報

 ここで言う多重音声放送とは、ステレオ音声による複数音声が選択可能な放送のことです。日本語と他国語の切り替えに使われることが多いですが、スポーツ中継などで実況と副音声の形で使われることもあります。

 注意事項があります。PCでTVを録画する場合、番組開始前に5秒程度のマージンを取っている方が多いのではないでしょうか。その場合、多重音声放送であっても、FFmpegの制限により”-multi”オプションは使えません。ファイルの先頭から多重音声でないとFFmpegが多重音声と認識できないためです。

 この問題は、Windows用の”Murdoc Cutter”と言うアプリを使って多重音声放送の頭出しをすることで解決します。FFmpegによる頭出しは出来ません。私が調べた限り、それ以外の方法は見つかっていません。

以上、epgstationの問題ではなく、mirakurunの開始マージン、私のアンテナ環境、-multiオプションなどの問題と考えられます。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants