ustreamのflvの音声変換

nelly2pcm + sox でいけました!

nelly2pcm test.flv | sox -t raw -c 1 -2 -r 11000 -s - test.wav

#plagger-ja++

by typester / at 2007-10-03T22:14:00 / ustream / Comment

ustreamの録画flvデータのURLを得るスクリプト

Clouder::Blogger: ustreamの録画した動画のflvをダウンロードする方法

これは想像ですが、swf内でhttp://gw.ustream.tv/gateway.phpをPOSTしているのはわかっているので、そこで取得しているのか、もしくはJavaScriptでAjaxをつかってどこかから取得しているのか、といったところだと思いますが、いずれにしてももう少し解析が必要です。

とあるのをみて、gateway.php を調べてみました。

これはFlashのAMFのRPCサーバーで、録画されたものを再生するときには client.watch_video という関数を呼んでいるようです。

as3で書くと

package {
    import flash.display.*;
    import flash.net.*;

    public class gw extends Sprite {
        public function gw() {
            stage.align = StageAlign.TOP_LEFT;
            stage.scaleMode = StageScaleMode.NO_SCALE;

            var cid:String = stage.loaderInfo.parameters["cid"];
            if (cid) {
                var nc:NetConnection = new NetConnection();
                nc.objectEncoding = ObjectEncoding.AMF0;
                nc.connect("http://gw.ustream.tv/gateway.php");
                nc.call("client.watch_video", new Responder(gatewayHandler), { cid: cid });
            }
        }

        private function gatewayHandler(res:Object):void {
            for (var i:String in res) {
                log(i+": "+res[i]);
            }
        }
    }
}

こんな感じになります。cid は再生URL http://ustream.tv/recorded/RLdKCmCouWOpkkEznZH4QA とかの RLdKCmCouWOpkkEznZH4QA 部分です。

これをperlで呼ぶにはどうしたらいいか! ということでがんばってみました。

CPANにこのAPIのサーバー側の実装 (AMF::Perl) があったのでそれを適当に読んだり、実際API呼んでるときのパケットと見比べたりしつつして以下のようにすればできました。

#!/usr/bin/env perl

use strict;
use warnings;

use AMF::Perl;
use LWP::UserAgent;

my $cid = shift || '5Fq8cQp9eHsEEknbQ22OOZniqS2xUiuz';

my $amf = AMF::Perl::Util::Object->new;
$amf->addBody('client.watch_video', '/1', { cid => $cid });

my $outputstream = AMF::Perl::IO::OutputStream->new;
my $serializer = AMF::Perl::IO::Serializer->new($outputstream, 'utf-8');
$serializer->serialize($amf);

my $amfdata = $outputstream->flush;

$amfdata =~ s/\xff\xff\xff\xff/\0\0\0\x31\x0a\0\0\0\x01/;

my $ua = LWP::UserAgent->new;

my $req = HTTP::Request->new( POST => 'http://gw.ustream.tv/gateway.php' );
$req->content( $output );
$req->content_type('application/x-amf');
$req->content_length( length $amfdata );

my $res = $ua->request($req);

my $deserializer = AMF::Perl::IO::Deserializer->new(AMF::Perl::IO::InputStream->new($res->content), 'utf-8');

use YAML;
print Dump $deserializer->getObject->getBodyAt(0)->{value};

これで

---
err_desc: ok
server_id: 9
success: 1
user_id: 32983
video_length: 366.207
video_name: broadcast/35957/1191239239348
video_type: broadcast

とかいう出力がでます。これから

http://flash{server_id}.ustream.tv:18881/{video_name}.flv

というflvのURLが作れます。

perlソースの途中の謎の置換 s/\xff\xff\xff\xff/\0\0\0\x31\x0a\0\0\0\x01/; してて、これはなにかよくわかってません。ただ実際のパケットと見比べて違う部分置換してみたらいけたという代物です。

あとこれで得られるflvデータの音声部分が謎のcodecで変換できない! だれかこれをmp3とかにする方法ご存知のかたいましたらぜひともお知らせください!

by typester / at 2007-10-03T19:18:00 / perl · ustream / Comment

やっぱり

miyagawaさんと桜井侑斗は似ている説。

http://www.tv-asahi.co.jp/den-o/

どうか。

by typester / at 2007-10-02T09:19:00 / life / Comment

Shibuya.pm tech talk #8

Flash with perlとかいうタイトルでLTしてきました。with perl の部分ありませんでしたがw

スライドはここにおいておきます。

http://unknownplace.org/slides/shibuyapm-8/start.html

まとめでいうのわすれたのだけど、ここで紹介したファイルアップロード、クロスドメイン通信、XMLSocketなんかを全部jsから使えるってのがアツイです。みんなやってみて!

あと、PSPでスライド操作するやつもcodereposに上げました。

http://coderepos.org/share/browser/lang/perl/misc/typester-shibuyapm-8-psp

時間なかったのでPSP側の画面真っ白なんだけど、時間表示したり、IRCチャット表示したりとか、作りこんだら楽しそうかも。

by typester / at 2007-10-02T07:17:00 / life · shibuya.pm / Comment

danさんのところで

404 Blog Not Found:プログラムの楽しさを子供に教えるべきか?

世の中には、「この時期に習っておかないと一生自分のものにならない」というものもあれば、「いつはじめても、モノにできる」というものもある。「流暢な外国語」は前者だが、プログラミングは明らかに後者。

をとかいうのを読んで、あー、ぼくも小さいころから楽器を習わされていて、たしかに大人になってからはじめたら到底今のレベルにはたどり着けないなーとおもった。親に感謝しなければ。

しかしもう5年くらいまったくひいていない。だめすぎる。。><

つわけで弦を買った。

fiddle strings

明日からちゃんと毎日ひく所存です。

by typester / at 2007-09-27T00:16:00 / life / Comment

CCFF7

週末会社に送られてきているのを発見して、ちょいと拝借してやってみてたのだけど、意外と面白くて連休でクリアしてしまった。

アクションなのだけど難易度的にはすごく簡単で、たいていの敵が初回で、もしくは1,2回やりなおせばクリアできる。約12時間くらいで終わってしまった。ミッションはまったくやってないけど。

強くてニューゲーム的なことができるみたいだけど、ストーリー悲しすぎるのでもう一度やるきにはならない。。。

ほんとうにかなしいなぁ。書いてたら思い出してきた。><

FF7好きだった人はやるべきゲームかと。

by typester / at 2007-09-18T08:29:00 / life · game / Comment

コミュニケーション能力

意外と思う人もいるかもしれないけど、技術者には重要だよね。特にオープンソースなところでは。

codereposもそうだけど。意見とか、わからないこととか、ひとりでうだうだいってないでIRCにきて他のコミッターと話をすればいい。

そゆことがCatalystやDBICのコミュニティでできないのが悔しい。言葉の壁が思ったより厚くていまだに超えられない。IRCだとなにいってるかわかってもこっちのいいたいことがうまくいえない。考えてる間に話し進むし。ムキィ。

by typester / at 2007-09-17T23:32:00 / life / Comment

会社名、所属明らかにしてブログ書くこと

個人的なブログで、個人的な意見をかいているとしても、好き勝手書いてもいいとは思えないよ。

これって、会社を自分の会社だって思えているかどうかだと思うのだけど。大企業になるとそうは思えなくなるのかもしれないなぁ。

by typester / at 2007-09-13T23:08:00 / life / Comment

@-moz-document url-prefix("http://coderepos.org/share/browser") { table.code th.lineno { width: 7em !important; } }

100行目以降がはてなスターのおかげで行数あいてしまうのでちょいカラムひろげてみた。どするのがいいのか。

by typester / at 2007-09-13T18:22:00 / firefox / Comment

CatalystアプリのスタータースクリプトをCodeReposに

あげた。

もともと使ってるのはpmsetupを改造したので雛形つくるだけだったんだけど、毎回DBとか使うわけでもないので、ついでにそこを選べるように改造した。

ほぼ僕専用ルールにのっとった雛形を作成しますので他の方はまったく使えないと思いますが、参考にはなるかもしれません。

他の方のも見てみたいのでぜひともcodereposで共有しましょう!

あ、Catalyst自分規約カンファレンス、とかおもしろいかもしれない。

by typester / at 2007-09-13T16:48:00 / perl · catalyst / Comment

27 28 29 30 31 32 33 34 35 36

(Page 31 of 203)