Ustream の動画情報

Ustream のチャンネルから配信動画の情報を取得してみたいと思います。

ここでは NASA TV のチャンネル nasa-hd-tv で進めていきます。

cid の取得

ページのソース(HTML)の頭の方にこんな記述があります。

<meta name="twitter:player" value="https://www.ustream.tv/embed/6540154">

6540154 がこのチャンネルの cid です。その他、ソースの各所に埋めこまれていますが、一番みつけやすいのがこの部分です。

Ustream API で HTML 出力を用いた場合は、 一番上の id の箇所になります。

プログラム上で参照したい場合は出力形式を XMLJSON にした方が便利です。 response['results']['id'] です。

Ustream API

API を利用するにはディベロッパキーを取得したうえで、 key=dev_key を付加する必要があるそうです。

  • http://api.ustream.tv/format/channel/channel_name/getInfo?key=dev_key

しかしキーなしでアクセスしても問題なく取得できました。もしかしたら、リクエスト数やサーバの負荷状況などによって制限されたりするのかもしれません。キーをとっておく方がよいでしょう。

AMF ファイルを取得

先程取得した cid で AMF ファイルを取得します。

  • http://cdngw.ustream.tv/Viewer/getStream/1/cid.amf

AMF ファイルは AMF0 - 見上げれば、空 で読み方がわかりました。これを解析するといろいろな情報がわかります。

一旦中継が途絶してしまった場合など、ストリームの URL などが変化します。必要に応じて AMF ファイルを取得しなおしてください。

{
  "header": [
    {
      "name": "AppendToGatewayUrl",
      "understand": false,
      "length": 46,
      "value": "?PHPSESSID=582995abc22b21bd9fd543c5e8396205"
    }
  ],
  "message": [
    {
      "target_uri": "/1/onResult",
      "response_uri": "null",
      "length": 5680,
      "value": {
        "__debug_ip": "173.88.220.193",
        "__debug_countryCode": "US",
        "isFeaturedOnUstream": true,
        "socialStreamSettings": {
          "prefix": "#NASATV",
          "suffix": " ( #NASATV live at http://ustre.am/rrom)"
        },
        "conviva": true,
        "quantcast": true,
        "status": "online",
        "streamId": "118344159",
        "broadcasterType": "fme",
        "startedAt": "2012-11-13 05:44:52",
        "viewerNumber": "58",
        "useUmsViewerCount": false,
        "cdnUrl": "rtmp://ustreamlivefs.fplive.net/ustream4live-live/",
        "streamName": "stream_live_1_1_6540154",
        "liveHttpUrl": "http://iphone-streaming.ustream.tv/uhls/6540154/streams/live/iphone/playlist.m3u8",
        "offairContent": {
          "videos": [
            "27030658"
          ]
        },
        "moduleConfig": {
          "meta": {
            "tags": [
              "HD",
              "NASA",
              "Science"
            ],
            "title": "NASA Public",
            "tagline": "Broadcasting NASA TV in HD!",
            "keywords": [
              "HD",
              "NASA",
              "Science"
            ],
            "twitter": {
              "type": "hash",
              "prefix": "#NASATV",
              "suffix": " ( #NASATV live at http://ustre.am/rrom)",
              "tinyUrl": "http://ustre.am/rrom"
            },
            "url": "http://www.ustream.tv/nasahdtv",
            "embeds": {
              "media": "<object ...(略)",
              "videoFeedWidget": "<object ...(略)",
              "chat": "<embed ...(略)",
              "social": "<iframe ...(略)"
            },
            "category": [
              "Technology",
              "Science"
            ],
            "userName": "NASAtelevision",
            "customWidget": false,
            "broadcasterType": "fme",
            "broadcasterDevice": "FMSc/1.0 (compatible; FMSc/1.0)",
            "extAutoPlayFalseMode": false,
            "extAutoPlayFalseModeBg": false
          },
          "share": [
            {
              "name": "facebook",
              "url": "http://www.facebook.com/dialog/feed?app_id=123875465478&redirect_uri=http://ustream.tv/&link="
            },
            {
              "type": "hash",
              "prefix": "#NASATV",
              "name": "twitter",
              "shortenedUrl": "http://ustre.am/rrom"
            },
            {
              "name": "embed",
              "embedCode": "<object ...(略)"
            },
            {
              "name": "mail"
            },
            {
              "name": "mixi",
              "url": "http://mixi.jp/share.pl?k=91ddbbb3ab57e442c177f34c9e09e22dfc15da59&u="
            }
          ],
          "logo": [
            {
              "align": "2",
              "margin": "5",
              "mobile": false
            }
          ]
        },
        "localeIn": "empty",
        "localeOut": "en_US",
        "socialStreamEnabled": false,
        "chatEnabled": false,
        "shortenedUrl": "http://ustre.am/rrom",
        "streamVersions": {
          "streams/live_1": {
            "streamId": "118344159",
            "audioBitrate": "0",
            "audioCodec": null,
            "videoBitrate": "0",
            "videoCodec": null,
            "isDefault": "1",
            "isTranscoded": "0",
            "transcodingPreset": null,
            "streamVersionCdn": {
              "akamai": {
                "cdnStreamName": "ustream-sj2_902@59146",
                "cdnStreamUrl": "rtmp://cp152495.live.edgefcs.net/live"
              },
              "level3": {
                "cdnStreamName": "stream_live_1_1_6540154",
                "cdnStreamUrl": "rtmp://ustreamlivefs.fplive.net/ustream4live-live/"
              }
            }
          }
        },
        "videoCodec": {
          "videoBitrate": -280.0,
          "level": -30.0,
          "height": -0.0,
          "compatibleProfiles": -192.0,
          "width": -0.0,
          "levelName": -3.0,
          "videoCodecType": "H264",
          "profileName": "BaseLine",
          "profile": -66.0,
          "version": -1.0
        },
        "audioCodec": {
          "audioSampleSize": "16-bit",
          "audioCodecType": "AAC",
          "audioSampleRate": "44-kHz",
          "audioSoundType": "stereo",
          "audioBitrate": -64.0
        },
        "success": true
      }
    }
  ],
  "version": 0,
  "header_count": 1,
  "message_count": 1
}