raccy / obs-rtmp-nicolive

ニコニコ生放送用 OBS Studio プラグイン
MIT License
57 stars 8 forks source link

Windows 版 動作確認結果 #1

Closed shousa closed 9 years ago

shousa commented 9 years ago

Windows 7 環境で、obs-studio 本体、およびニコ生プラグインをビルドしました。(32bit版) [設定] > [配信] > [配信種別] で、NiconicoLive を選択してメールアドレスとパスワードを入力すると、 AppData\Roaming\obs-studio\basic\service.json には、メールアドレスとパスワードが設定されていました。 配信開始ボタンを押しても配信が開始されないので、プロセスにアタッチしてデバッグ出力を見たところ、 以下のメッセージが表示されていました。SSL通信で何か問題がありそうです。

[nicolive] login start qt.network.ssl: QSslSocket: cannot call unresolved function SSLv23_client_method qt.network.ssl: QSslSocket: cannot call unresolved function SSL_CTX_new qt.network.ssl: QSslSocket: cannot call unresolved function SSL_library_init qt.network.ssl: QSslSocket: cannot call unresolved function ERR_get_error qt.network.ssl: QSslSocket: cannot call unresolved function ERR_get_error [nicolive] login finished [nicolive] [nicolive] login failed

raccy commented 9 years ago

Win版Qt特有の問題の可能性があります。 {Qtインストールフォルダ}/Tools/{コンパイル時のコンパイラ名:vs2013やmingw32など}/opt/bin の中にある下記二つのファイル

をexeファイルと同じフォルダにコピーしてみて動くかどうか見てくれませんか?

参考 http://qt-project.org/forums/viewthread/35300 http://stackoverflow.com/questions/10846536/unresolved-functions-while-working-with-qsslsocket

あと、Qtのバージョン、使ったコンパイラの種類とエディションとバージョンについても情報いただけると助かります。

shousa commented 9 years ago

まず環境についてですが、Qt 5.3、cmake-3.0.0-win32-x86、Visual Studio 2013 Communityです。

こちらでも調べた結果、Windows環境にはOpenSSLがないので、 上記の2つのdll (libeay32.dll, ssleay32.dll) を追加すれば良さそうだと思い、 OpenSSLをインストールしてそこにあったdllを使用すると、上記のエラーは解消しました。 ところが、Qt配下のdllを使用すると、何故かOBSがクラッシュしてしまいました。 とりあえず、OpenSSLのdllを使用することにして配信開始ボタンを押下すると、 [nicolive] web get start [nicolive] web get finished [nicolive] live waku: lvXXXXXXXXX [nicolive] web get start [nicolive] web get finished [nicolive] live waku: lvXXXXXXXXX [nicolive] web get start [nicolive] web get finished [nicolive] found live url

[rtmp stream: 'default_stream'] Connecting to RTMP URL Vmp://nlpoca124.live.nicovideo.jp:1935/publicorigin/(以下略) Unknown protocol!

rtmp server sent error rtmp server requested close [rtmp stream: 'default_stream'] Connection to Vmp://nlpoca124.live.nicovideo.jp:1935/publicorigin/(以下略) failed: -3

となり、放送番号は取得できているけど、rtmp url のほうがうまく取得できていない感じがします。

shousa commented 9 years ago

以下のコードの部分に、info で live url の出力を追記してみたところ、 if (reader.isCharacters()) { this->live_url = reader.text().toString(); info("live url: %s", this->live_url.toStdString().c_str()); this->live_key = this->live_id; // same stream key and live id success = true; info("found live url"); break; [nicolive] web get finished [nicolive] live url: rtmp://nlpoca109.live.nicovideo.jp:1935/publicorigin/(以下略) [nicolive] found live url という出力になり、getpublishstatus の取得自体は正常のようです。 [rtmp stream: 'default_stream'] Connecting to RTMP URL の先頭部分が変な感じになっているので、 Unknown protocol!

HandShake, client signature does not match! rtmp server sent error rtmp server requested close という状態で、failed: -3 を返している感じですね。

shousa commented 9 years ago

[追記] rtmp部分の先頭の文字は、上記の例の"V"に限らず、毎回違う文字になっているようです。 rtmp stream との間で、受け渡しがうまくいっていないのでしょうか?

raccy commented 9 years ago

他の情報見てもQt付属のOpenSSLはおかしいみたいですね。ライセンス上の関係でダミーなのかもしれません。

先頭文字が変わる現象について考えられるのはQString#toStdString().c_str()で生成されるcost char *が関数に渡されて処理される前に、解放されちゃって他に上書きされたとかでしょうかね。元のQStringが変更されない限り解放されないはずなんですけど、動きが謎です。(ただ、ここら辺はちょっとコードもあやしい)

cmake実行時に -D CMAKE_BUILD_TYPE=Debug オプションを付けると細かいデバッグログ(うざいぐらい出ます)もでますので、どこら辺で変わっているか、見てもらえませんか?

shousa commented 9 years ago

とりあえず、元のコードのdebug()をinfo()に変えてみて実行した結果です。

・extern "C" const char nicolive_get_live_id(const char session)が呼ばれる ・const char *NicoLive::getLiveId()が呼ばれる

・bool NicoLive::siteLiveProf()が呼ばれる

[nicolive] live url: rtmp://nlpoca106.live.nicovideo.jp:1935/publicorigin/(以下略) [nicolive] found live url

・const char *NicoLive::getLiveId()に戻る

[nicolive] nioclive.live_id: lvXXXXXXXXX

・static bool rtmp_nicolive_initialize(void data, obs_output_t output)に戻る

[nicolive] set live url and key

・extern "C" const char nicolive_get_live_url(const char session, const char live_id)が呼ばれる ・const char NicoLive::getLiveUrl(const char *live_id)が呼ばれる

[nicolive] check live_id: 'Eメ霾V' [nicolive] check this->live_id: 'lvXXXXXXXXX' [nicolive] same? 0 [nicolive] nioclive.live_url: rtmp://nlpoca106.live.nicovideo.jp:1935/publicorigin/(以下略)

・extern "C" const char nicolive_get_live_key(const char session, const char live_id)が呼ばれる ・const char NicoLive::getLiveKey(const char *live_id)が呼ばれる

[nicolive] check live_id: 'ァ ' [nicolive] check this->live_id: 'lvXXXXXXXXX' [nicolive] same? 0 [nicolive] nioclive.live_key: lvXXXXXXXXX

・static const char rtmp_nicolive_url(void data)が呼ばれる

[nicolive] service->server: 'Emp://nlpoca106.live.nicovideo.jp:1935/publicorigin/(以下略)'

[rtmp stream: 'default_stream'] Connecting to RTMP URL Emp://nlpoca106.live.nicovideo.jp:1935/publicorigin/(以下略) Unknown protocol!

shousa commented 9 years ago

念のため Qt 5.4.0 でもビルドして試してみましたが、Qt 5.3 のときよりさらに別の問題がいろいろ出たので断念。

shousa commented 9 years ago

Qt 5.4.0 でもdllの依存関係をいろいろ解決して、OBSの実行は出来るようになりましたが、 やはりservice->serverの値がおかしい状態は変わらずで、配信開始は出来ませんでした。

raccy commented 9 years ago

QString.toStdString()で生成されたstd::stringが関数抜けると同時に破棄されて、 c_str()で生成したconst char *が不定なってしまっているっぽい。 とりあえず、一個だけbuff持たせて対処してみてたので、pullし直してみてください。

shousa commented 9 years ago

とりあえず1枠だけテストしてみましたが、上手く動作するようになりました。 対応ありがとうございます。