BMS2用Luaスクリプト

BEER Media Server 2 (BMS2) 用のLuaスクリプトを公開しています。

BMS2とはmalcome様によるwindows上で動作するDLNAサーバーソフトウエアです。
http://code.google.com/p/beer-media-server2/

BMS2をパソコンで動かすことで、DLNAクライアントからパソコン上の動画・画像・音声をネットワーク経由で視聴する事ができます。最近のテレビはDLNAクライアント機能が付いているものが多くなっています。

BMS2ではDLNAクライアントに合わせた専用のLuaスクリプトを用意すると多くのメディアファイルを再生できるようになります。
本ページでは次のDLNAクライアント用Luaスクリプトを公開しています。


common.lua
クライアント識別用スクリプト
REGZA-ZP2.lua
REGZA ZP2 Z2用スクリプト 他のレグザでも動くと思います
マルチ音声トラック対応 テレビの音声切替で選べます
VIERA-GT3.lua
VIERA GT3用スクリプト 他のビエラでも動くと思います
マルチ音声トラック対応 テレビの音声切替で選べます
PS3.lua
PlayStation3用スクリプト ベータ版
16:9以上の場合は画面モードを"フル"にしてください
16:9未満の場合は画面モードを"ノーマル"にしてください
musicはVIDEOに変換されます
MediaHouse.lua
そのままファイルURLを渡す形になります。MX 動画プレーヤー等で再生します
MX動画プレーヤーで再生できるメディアはほぼ再生できるようです
トランスコード再生はできません

BMS2と本Luaスクリプトを使用すると、パソコン上のメディアファイル(ビデオ、音楽、画像)をテレビで視聴する事ができます。
テレビで再生不可能な形式のメディアファイルもトランスコード機能により視聴できるようにしています。

common.lua スクリプトはBMS2にクライアント用Luaスクリプトを認識させるために必要です。

common.luaとクライアント用スクリプトをBMS2フォルダ下のscriptフォルダ下に"User"というフォルダを作成し保存してください。その後、BMS2フォルダの"BMS_setting.exe"を実行し、Userフォルダをユーザースクリプトフォルダに追加してください。
BMS2のscriptフォルダにあるcommon.luaを本ページのcommon.luaファイルで上書きしてはいけません。

トランスコードにはFFmpegを使用しています。別途FFmpegの実行ファイルが必要です。
本LuaスクリプトではZeranoe FFmpegの実行ファイルで動作確認をしています。そのページのPrevious FFmpeg 32-bit Static Versionsの"ffmpeg-3.3.2-win32-static"です。このファイルを解凍しbinフォルダのffmpeg.exeをBMS2のフォルダへ置いておく必要があります。
FFmpegは常にアップデートされています。できるだけ最新ビルドで試しています。

また、rigaya様のQSVEncCを使う事でIntelのQuick Sync Videoでのトランスコードにも対応しています。QSVを使う場合はQSVEncCをBMS2と同じフォルダに置いてください。FFmpegも必要です。FFmpeg 3.0以上を使ってください。3.0からオプション指定が変わったコーデックを使うためです。
Luaスクリプト内のUseQSVをtrueにするとQSVEncCを使います。

【2016-03-29 QSV使用時はFFmpeg 3.0以上をBMS.exeと同じフォルダに置いてください】

メディアファイルの主な対応

FFmpegでデコードできるフォーマットは基本的にトランスコード視聴させる事が可能ですが、Luaスクリプトで対応している必要があります。

本Luaスクリプトで対応する主なメディアファイル
  • コンテナ
    • AVI, mp4, matroska, mpeg2-ts, mpeg2-ps,  FLV
  • ビデオコーデック
    • mpeg2, mpeg4, h.264, wmv
  • オーディオコーデック
    • wma, mp3, ac3, aac
手元にあるメディアファイルだけ記載しています。ビットレートや解像度によっては対応できない場合があります。コンテナとは入れ物です。対応コンテナであっても中のビデオ・オーディオファイルに対応できない場合があります。
DVD ISOに対応するスクリプトは記述していますが動作は確かめていません。【2014/10/23 対応するスクリプトは削除しました。他のコンテナを使う事をお勧めします。】

字幕対応 (トランスコード時)

  • 字幕形式
    •  PGS, VobSub
matroskaコンテナ内の字幕トラックを想定しています。
フルHDの場合トランスコードが間に合わない場合があります。その時は字幕を縮小表示する事で回避します。Luaスクリプト内のSubScale変数に1以上の値を設定してください。2と設定すると字幕が1/2に縮小表示されます。

マルチ音声トラック対応(トランスコード時)

コンテナ内の音声は全てのトラックをテレビへ送っています。ビエラとレグザでは8つの音声トラックまでテレビで切替できることを確かめています。8つ以上も動くかもしれませんが確かめていません。
ビエラ用ではAACとAC3のトランスコードを行いません。元のまま送ります。
レグザ用ではAC3のトランスコードを行いません。元のまま送ります。
元のAAC/AC3によっては再生できない可能性があります。
音声チャンネル数は2chステレオへダウンミックスを行いません。元のチャンネル数が維持されます。テレビをAVアンプなどにつないでいればマルチチャンネル音声の再生ができます。

Luaスクリプトの調整可能なパラメータ

調整可能なパラメータ (トランスコード時)
  • UseQSV (Boolean)
    • トランスコードにQSVEncCを使うか
    • true:使う false:使わない(推奨)
  • SubScale  (実数)
    • トランスコードが間に合わない場合に字幕を縮小表示させる
    • 1.0: 等倍表示(推奨) 2.0: 1/2表示
  • ShowInfo (Boolean)
    • トランスコード時にメディア情報を映像に表示する
    • true:表示する (推奨)
      false:表示しない
    • trueの場合、--enable-libfreetypeとしてビルドされたFFmpegでないとエラーになります
    • 300フレーム表示後に消えます
  • vbitrate (実数)
    •  FFmpegトランスコード時のビットレート
  • UseQscale(Boolean)
    • ffmpegトランスコード時に固定量子化を使うか
  • Audio2Video
    • オーディオ再生時の映像を選択します。
    • "CQT" Constant Q Transform (default)
    • "LIFE" Life Game
以下にLuaスクリプトを公開しておきます。

DOWNLOAD

ファイルはこちらからダウンロードしてください
Lua Scripts  (Google Drive)
  • common.lua
    • 2014/11/01
  • REGZA-ZP2.lua
    • 2018-11-11
      • loudnormフィルタ使用
      • MKA対応
  • VIERA-GT3.lua
    • 2016-11-11
      • loudnormフィルタ使用
      • MKA対応
  • PS3.lua
    • 2015-04-28
      • ER Parametricをトランスコードするよう追加
        round関数のd値保護の間違えを修正
  • MediaHouse.lua
    • 2013/01/14

更新情報

2018-10-11 オーディオファイル再生時にloudnormフィルタを使用
2018-10-10 MKAオーディオでエラーになるのを修正
                  オーディオフォーマットの選択にOrdSet関数を使うように変更2016-03-29 FFmpeg3.0のオプション指定に変更(QSV用)
2016-03-15 VIERA-GT3.luaのオーディオ再生時の映像を選択できるようにしました。
2015-04-28 round関数のd値保護の間違えを修正
                 ER Parametricをトランスコードするよう追加
2015-01-23 ffmpegトランスコード時に固定量子化を選択できるようにしました
2014-11-21 ビエラ版QSV使用時にカクつくのでprofileをBaselineにしました
2014/11/01 全ての表示可能な字幕トラックを選択できるようにした
2014/10/23 FFmpeg Ver.2.2以後QSVが動かなかったのを修正
2014/10/13 AC3音声はトランスコードしないよう修正(レグザ用のみ)
2014/10/11 AAC・AC3音声はトランスコードしないよう修正(ビエラ用のみ)
2013/10/08: QSVEncCのエンコード品質指定オプションの変更に対応
2013/10/07: 公開コードが文字化けだらけでした・・・
2013/09/14: common.luaにXBMCの識別部分を追加

MInfoKeys

bms.iniに設定している[MInfoKeys]を参考に載せておきます。

[MInfoKeys]
=General;Format
=General;TextCount
=Video;Format_Profile
=Video;Format
=Video;Width
=Video;Height
=Video;BitRate
=Video;FrameRate
=Video;FrameRate_Mode
=Video;Standard
=Video;CodecID
=Video;DisplayAspectRatio
=Video;ID
=Video;ScanType
=Audio;BitRate
=Audio;SamplingRate
=Audio;ID
=Audio;Format
=Audio(1);Format
=Audio(1);Channel(s)
=Audio(1);BitRate_String
=Audio(1);Language
=Audio(2);Format
=Audio(2);Channel(s)
=Audio(2);BitRate_String
=Audio(2);Language
=Text(1);Format
=Text(2);Format
=Text(1);Language
=Text(2);Language

コメント

  1. 進化したのですね。
    luaファイルはどうやって作成するのでしょうか。
    ieで展開後に全行を選択してコピー後、メモ帳でペーストすると改行がおかしくなります。CR/LFの問題?
    どのような環境を想定していらっしゃるのでしょうか。
    ご教示いただけませんか。

    返信削除
    返信
    1. 説明不足でごめんなさい。
      コードの上でダブルクリックするとコード全体が選択されます。その後コピーするとメモ帳でもちゃんと張り付くと思います。
      少なくとも私のwindows8のメモ帳では改行も再現しています。もしもダメなら他のテキストエディタを試されてはどうでしょうか?
      うまくペーストできたらUTF-8形式で保存します。

      削除
    2. 迅速なご対応ありがとうございます。
      ダブルクリックだったのですね。
      うまくできました。

      削除
  2. BMS2使わせてもらってます。PMSは重くてダメっぽいのでps3.lua使ってます。
    n-50でも使いたいんですが、N-50からdlna経由が全滅っぽい。
    PS3でもMP3はvideo側なんですよね。
    動画まわりはオッケーなので、なんとかなりませんかね?
    オーディオのみのluaとか書き方わかりませんか?
    flacも対応してくれるとマジで神ソフトになれるとおもうんですが。勝手ばかり言ってすみません。

    返信削除
  3. 追記です。GPIは以下の通りです。mp3はなんとか再生出来ました。
    http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM
    http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM
    http-get:*:audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM
    http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM
    http-get:*:audio/mpeg:DLNA.ORG_PN=MP3
    http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMABASE
    http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMAFULL
    http-get:*:audio/mp4:DLNA.ORG_PN=AAC_ISO
    http-get:*:audio/3gpp:DLNA.ORG_PN=AAC_ISO
    http-get:*:audio/vnd.dlna.adts:DLNA.ORG_PN=AAC_ADTS_320
    http-wavetunes:*:audio/x-ms-wma:*
    http-get:*:audio/wav:*
    http-get:*:audio/x-wav:*
    http-get:*:audio/flac:*
    http-get:*:audio/x-flac:*
    http-get:*:audio/m4a:*
    http-get:*:audio/x-m4a:*
    http-get:*:audio/x-caf:*
    http-get:*:audio/x-aiff:*
    http-get:*:audio/aiff:*
    http-get:*:audio/mp4:*

    返信削除
    返信
    1. N-50ですか? こんなプレーヤーがあるんですね。

      私のスクリプトはすべてビデオに変換してしまいます。そのためオーディオ専用の機械ではファイルを認識しないでしょう。
      N-50ほどの再生能力があるならFFmpegでトランスコードする必要もないと思われます。トランスコードをしないならばPS3.luaとかは無駄に複雑で判りにくいです。
      MediaHouse.luaを元にして修正するのが良いと思います。

      MediaHouse.luaでWAVEとかMP3と書いてある部分を参考にflacを追加してやればいいだけだと思います。
      ポイントはminfo.General.Formatでなんという文字が返ってくるか、という部分ですね。私の手元にはflacファイルがありませんので判りませんがmi.exeで確認できますよ。
      ぜひこの機会にもうちょっとLuaスクリプトをいじって見てください。

      削除
    2. 早速の返信ありがとうございます。参考にしてみます。
      手持ちの192kFLACのMI結果です。
      Audio.BitRate = 5382517
      Audio.Channels = 2
      Audio.Format = FLAC
      Audio.ID =
      Audio.SamplingRate = 192000
      Chapters.Format =
      General.AudioCount = 1
      General.Duration = 00:04:05.226
      General.File_Created_Date_Local = 2013-08-10 09:54:53.305
      General.Format = FLAC
      General.VideoCount = 0
      Image.Format =
      Menu.Format =
      Text.Format =
      Video.BitRate =
      Video.CodecID =
      Video.DisplayAspectRatio =
      Video.Duration =
      Video.Format =
      Video.Format_Profile =
      Video.FrameRate =
      Video.FrameRate_Mode =
      Video.Height =
      Video.ID =
      Video.ScanType =
      Video.Standard =
      Video.Width =

      削除
    3. flacはこんな風になっているんですね。オーディオだけならこんな風になっていれば十分だと思います。
      if minfo.General.Format == "FLAC" then
      return "audio/flac:*"
      end

      削除
    4. なんとかFLAC,mp3、WAV認識できました。ありがとうございました。
      これでcueシートも認識出来れば完璧ですが、
      ほぼ希望通りでいけました。
      ちなみに、NONAME.luaで認識しました。

      削除
    5. こんなかんじです。WMAやAIFF等は試してないので追加してません。


      BMS.SUPPORT_MEDIA_LIST = {
      "audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM",
      "audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM",
      "audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM",
      "audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM",
      "audio/mpeg:DLNA.ORG_PN=MP3",
      "audio/x-ms-wma:DLNA.ORG_PN=WMABASE",
      "audio/x-ms-wma:DLNA.ORG_PN=WMAFULL",
      "audio/mp4:DLNA.ORG_PN=AAC_ISO",
      "audio/3gpp:DLNA.ORG_PN=AAC_ISO",
      "audio/vnd.dlna.adts:DLNA.ORG_PN=AAC_ADTS_320",
      "audio/x-ms-wma:*",
      "audio/wav:*",
      "audio/x-wav:*",
      "audio/flac:*",
      "audio/x-flac:*",
      "audio/m4a:*",
      "audio/x-m4a:*",
      "audio/x-caf:*",
      "audio/x-aiff:*",
      "audio/aiff:*",
      "audio/mp4:*",
      }

      function BMS.GetPlayInfo(fname, minfo)
      --print("\r\nDEBUG: "..BMS.ClientInfo.ext.."\r\n")
      --local MimeTypeString=MimeTypeString
      local minfo = minfo

      if minfo.General.Format == "MPEG Audio" then
      return "audio/mpeg:DLNA.ORG_PN=MP3"
      end
      if minfo.General.Format == "Wave" then
      return "audio/wav:*"
      end
      if minfo.General.Format == "FLAC" then
      return "audio/flac:*"
      end
      end

      削除
    6. 他にdlnaのクライアントが無ければnonameでもいいんですけど、気になるならcommon.luaに追加が必要です。BMS2でログを記録してN-50が返す文字列を見つけ固有のキーワードで判別するスクリプトを追加します。

      オーディオファイルにはcueというのがあるんですね。ビデオのチャプタみたいなものですか。残念ながらBMS2で読むことはできないでしょう。最近オーディオ関係は無頓着だったものでいろいろ刺激になります。

      削除
  4. 日にちが経ってしまい、すみません。N-50についてです。
    GPIを実行で、以下が出てきました。
    HTTP/1.1 200 OK
    CACHE-CONTROL: max-age=1800
    EXT:
    LOCATION: http://192.168.*.*:8080/description.xml
    SERVER: KnOS/3.2 UPnP/1.0 DMP/3.5
    ST: upnp:rootdevice
    (適当にぼかしてあります)
    これのSERVERの文字列を参考でいいのでしょうか?

    返信削除
    返信
    1. GPI.exeはいりません。bms2でRefreshボタンを押して画面に
      *** ScriptName = NONAME
      という部分があるはずです。その上の方で
      GET /desc.xml HTTP/1.1
      とある行までがキーワードになります。この部分でN-50特有の文字列を見つけて判別する必要があります。ネットに他の機器がある場合はそいつも同じような通信をしています。N-50のIPアドレスの通信部分を見つけてください。
      物によっては特有の文字列が見つからない機械もあります。こんな場合はIPアドレス決め打ちしかできません。

      削除
  5. はじめまして
    ちょっと古い機種ですが、REGZA Z3500だと、ここにあるスクリプトを入れたら再生できません、と言われますが、そもそもデフォルトで入っているスクリプトだと.iso,moeg2はOKですが、mp4は映像は出ますが音声が出ない状態です。ffmpegを使う設定にできれば良いと思うのですが、簡単に試す方法はありますか?

    返信削除
    返信
    1. 音声が出ない場合はAC3かAACどちらかで再生できるか試す事になると思います。ffmpegのトランスコードで試せますが、私のスクリプトの場合はregza zp2用のaudio_cmdを設定しているところをいじります。

      私のスクリプトで再生できないのはMimeTypeStringでテレビに送っているメディアのタイプ情報がZ3500で再生できないものと認識されるからでしょう。デフォルトのスクリプトと同じ情報を返すようにすれば少なくとも映像は出そうです。

      Luaスクリプトをいじる必要はありますが、そんな難しくない言語なので挑戦してみてください。

      削除
    2. 返信ありがとうございます。その後も試していて設定ミスに気付きました。結果的には、Signal_Flag_ZさんのスクリプトでISO,MPGファイルは再生できていました。ありがとうございます。

      相変わらずmp4の音声はできていませんが、audio_cmdのところをいろいろ試してみようと思います。

      ところで、.iso,.mp4のファイルだけ、フォルダ構成になるのですが、理由はわかりますでしょうか?スクリプトの字幕とかのあたりなのかな?という気はしているのですが。
      例)
      実態:D:\DVD\hogehoge.iso
      設定:DVD=D:\DVD
      REGZA-> [DVD]\[hogehoge]\hogehoge.iso

      削除
    3. ZP2でもクセがあってちゃんと再生できる映像と音声の組み合わせはよく判らなくなります。AACはどうしても再生できなかったのでAC3にしています。

      フォルダ構成はcommon.luaのShowTranscodeFolderのせいでしょうか。ずっとfalseで使っていたのでtrueでの動作を忘れてしまっています。
      また、お気づきのように字幕やマルチ音声があるファイルの場合は選択をするためにフォルダっぽくなります。

      削除
  6. こんにちは。Z1にて本スクリプトを大変有り難く使わせて頂いております、ありがとうござます!
    手持ちの各種動画を再生していまして大半は問題なく再生出来ているのですが
    FLVのものだけ上下に小刻みに震えたような映像になっています(フリッカー?)
    MPC-HCで見たFLVのプロパティは以下の通りです。
    Video: MPEG4 Video (H264) 720x400 23.98fps 551kbps [V: h264 main L3.0, yuv420p, 720x400, 551 kb/s]
    Audio: AAC 44100Hz stereo 131kbps [A: aac lc, 44100 Hz, stereo, 131 kb/s]
    ffmpegのバージョンを変えてみたりvbitrateを変更してみましたが変わりませんでした、
    何か設定等で調整出来る箇所はありませんでしょうか。

    返信削除
    返信
    1. 最近はもう誰も使ってないのでは?なんて思っていたのでコメントいただいてうれしいです。
      インターレースが原因だとおもいます。上下にぶれるのは私も気になってました。REGZAで再生させるには一部の解像度でインターレース化が必要でした。プログレッシブで再生できる解像度へだけトランスコードするようにスクリプトを改造すれば回避できます。
      すべての解像度でプログレッシブ再生できる条件が見つかれば一番よいのですが、映像と音声の組み合わせにクセがあり再生させるだけで精一杯でした。

      削除
    2. あっ、FLVだけでしたか?
      フォールドオーダーは手抜きで判断していないのでトップとボトムで何かおかしくなるかもしれません。
      FLVは中身のビデオフォーマットに癖のあるものが多いです。1fpsとか平気であったり、オーディオが同期できないものも多い感じです。

      削除
    3. 素早いお返事ありがとうございます!
      一部の解像度でのREGZA固有のクセ(?)に起因するものだったのですね。
      解決方法はすべての解像度でプログレッシブ再生とのことですので、設定等で画質を落としたりなどで逃げるようなことも出来ないでしょうし根本の解決も難しそうですね汗
      (少なくともわたしがスクリプトをどうこうして解決出来るものではないw)
      ということでぶれる動画は大人しくmpeg2にエンコードします。
      #REGZAで動作する他のDLNAサーバーソフトも試してみていますが早送りが実用的なのはこちらだけです、今後とも有り難く使わせて頂きます!

      削除
    4. おっと、、もうひとつの書き込みを見逃していました、ごめんなさい汗
      その後いろいろな動画で試しましたところ他の形式でもぶれるものがありましたのではやはり解像度なのでしょうね。
      どっちにしても再生してみてぶれが気になる動画はさっさとエンコかとm(__)m

      削除
    5. 元のファイルをいじるのはお薦めしないです。ソースは大事に取っておきましょう。今のテレビで少しおかしいだけですから。
      Luaスクリプト REGZA-ZP2.luaの235行目あたりからが解像度の判断ロジックになります。
      interlace = "" とある解像度がプログレッシブに変換されテレビへ送信されます。プログレッシブで再生できる最大の解像度は1280x720です(16:9の場合)。
      if文をまとめて消して
       x, y = 1280, 720
       aspect = "4/3"
       interlace = ""
      とだけ書けば全てのビデオは1280x720のプログレッシブに変換され送られます。(aspectの値は間違えではありません)

      削除
    6. 再びお返事ありがとうございます。
      プログレッシブで再生できる最大の解像度は1280x720…、
      そういうことでしたか、最初のコメントの原因を間違って解釈していたようです汗
      で、早速アドバイス頂いた通りソースを修正しましたところばっちりでした!
      ただ早送りが遅くなってしまいましたので(再生動画が低解像度のため)
      元々のif文を元に変更、w<=640、w<=720でinterlace = ""、かつ高解像度の
      w<=1440とelse時のみx,y = 1280, 720のinterlace = ""とさせて頂きました、
      これで期待通りの動きとなりました~(^^♪
      おかげ様でエンコードする必要もなくなりました、今回は本当にありがとうございました、REGZAが壊れるまで使わせて頂こうと思いますw

      削除

コメントを投稿

最近のコメント

Threaded Recent Comments will be here.