ニコニコ生放送は、RTMPと言われるプロトコルで配信が行われている。

そこで、今回は、RTMPで流れるデータを保存することが可能な、rtmpdumpというソフトウェアを用いてニコニコ生放送上で行われているストリーミングを保存してみた。

(※自己責任で試してね♪何があっても、kasatomoは責任取らないよ!間違いとかは、どんどん指摘しちゃってください。)


rtmpdumpは、
http://rtmpdump.mplayerhq.hu/
から入手可能です。
(余談だが、Android版がある・・・wktkだな)

そして、ニコニコ生放送を保存する際に使用するオプションとその内容は以下の通り。

-r "[URL]"
-C S:"[TICKET]"
-f "WIN 10,1,51,66"
-s "http://live.nicovideo.jp/liveplayer_v2_6.swf?rev=20101210.1"
-o "[OUT_PUT_FILE]"
-v

がオプションで、以下がその内容

[URL]:getplayerstatusの「/getplayerstatus/rtmp/url」と放送IDをくっつけたやつ
[TICKET]:getplayerstatusの「/getplayerstatus/rtmp/ticket」
[OUT_PUT_FILE]:出力ファイル、flvがいいかも

そして、これが、テスト用のプログラム。
正常に録画できました!

手抜きな記事で申し訳ないです^^;
はてなと、ブログとっちに記事を書くべきか迷う。
どちらかに統一したいな。

C#でゼロ幅文字を利用する方法

ニコニコ動画や生放送では、CA(コメントアート)を利用する際に、整形のために実際には見えないけど実在する文字列を利用します。

それが、ゼロ幅文字列と呼ばれるのもなのですが、そのゼロ幅文字列をプログラム上でどのように利用するのかを紹介します。

もちろん、

string zero-weight = "(ゼロ幅文字をコピーアンドペーストで入力する)";

でもいいのかもしれませんが、

  • 見栄えが悪い
  • メンテナンスのときに混同してしまう

といった短所があります。

そこで、明示的にその文字列を利用する方法を調べてみました。

VC#では、

System.Convert.ToChar(0x200C).ToString();

を用いることで解決します。
これの0x200Cの部分を表現したい文字の文字コード(16進数)にすることでその文字に置き換えて利用できます。
ToString()の部分は、適所利用しやすい形式で利用してください。

ニコニコ動画などで一般に使われる空白文字は以下の表のようになっています。

Unicode(16進数) 使用用途
0x00A0 一番使われる空白文字です。無害で有能。幅は一般の半角スペースと同様
0x200C 基本的に化けないゼロ幅文字。ただし、big文字のときWin2000で縦棒が表示されてしまう。

この表は、
空白・特殊記号 - ニコニコ動画まとめwiki
を参考にしています。

ちなみに、私が開発しているThe菓子職人では、0x200Cを利用しています。
ただ、右寄せや左寄せのときに0x00A0などを利用しているところもあります。

C#でのXPath利用方法

この例では、ニコニコ生放送の一般タグの放送一覧RSSの1ページ目を取得してテストしています。

XmlDocument xml = new XmlDocument();
xml.Load("http://live.nicovideo.jp/recent/rss?tab=common&sort=start&p=1");

XmlNodeList list = xml.SelectNodes("/rss/channel/item/title");
foreach (XmlNode node in list)
{
   Console.WriteLine(node.InnerText);
}

このコードの結果、正常に各放送のタイトルを取得することができた。
また、次のようにすることで、各itemにある放送の詳細情報までを取得することが可能になる。

XmlDocument xml = new XmlDocument();
xml.Load("http://live.nicovideo.jp/recent/rss?tab=common&sort=start&p=1");

XmlNodeList items = xml.SelectNodes("/rss/channel/item");
foreach (XmlNode list in items)
{
    Console.WriteLine("Title:"+list.SelectSingleNode("title").InnerText);
    Console.WriteLine("Link:" + list.SelectSingleNode("link").InnerText);
}

こちらのほうが汎用性がありそうだね。

もちろん、XmlDocumentなどを使う際は

using System.Xml;

を忘れずに。