2007-05-26

高部真規子裁判長のおかげで、日本国内においてネットワークストレージが違法と相成りました

http://headlines.yahoo.co.jp/hl?a=20070525-00000119-mai-soci

これはどんなサービスかというと、ユーザが、自分の持っているCDを、MYUTAの提供するサーバにアップロードでき、そのユーザの携帯電話に落とすことができるというものだ。記事やプレスリリースを見る限り、ユーザ個人だけで完結するサービスのようで、他のユーザの音楽を落とせるサービスではないようだ。

東京地裁の「高部真規子」裁判長がだした判決のようだ。こんなもので訴えるJASRACもJASRACだが、判決を出す高部真規子も高部真規子だ。もはやこれはJASRACがどうとかいう問題を通り越してあきれてしまう。なんという裁判長。

これはすばらしい。日本国内では、ネットストレージサービスが違法になってしまった。この解釈で行くと、Webサーバ、POP3サーバなどのレンタルは違法になってしまうだろう。

なんという判決だろう。これはまずい。

 しかし、ぐぐってみたところ、この高部真規子という人間、恐ろしくトンデモ判決を多数出しているようだ。  あの有名な、松下がヘルプの機能で一太郎を訴えた裁判も、この高部真規子が出したらしい。  裁判官ってどうやって罷免させられるのだろう。

2007-05-19

FLV file structure

 最近、ニコニコ動画にハマっているのだが、FLVファイルの構造について知りたくなったので、調べていた。いくつか参考になりそうな情報が見つかった。 まず、ファイルの構造については、大まかにhttp://www.osflash.org/flvで情報がある。  直接のコードで読めて、参考になりそうなソースは、まずFLV Extractだ。これは、C#のコードだ。C#にはなじみがないのだが、かなりC++に似ている、というよりも、そのままだ。FLV Extractについては、単純なGUIとファイルアクセスなので、これをC++に移植することは、優しいことだろう。詳細な構造についてのソースコードが見たければ、ffmpegのコードを参考になりそうだ。  で、何がしたいかというと、どこの馬の骨かもわからないあのツールでマージするのではなく、自前でFLVのマージツールを作ってみようかと。

2007-05-17

how to change console's font?

 old new thingは実に役に立つ。たまたまコンソールについて悩んでいたら、ちょうどいいタイミングで、コンソールのフォントについて解説してくれた。 http://blogs.msdn.com/oldnewthing/archive/2007/05/16/2659903.aspx  なるほど、フォントの仕組みについてはよく知らなかったのだが、はみ出す文字というのがあるのか。  それにしても、ABCなんて名前の構造体を定義しているPSDKもどうかとおもう。もちろん、そんな名前が実際に使われることは、まずないだろうとしても。  一応、スーパーギークのために、フォントを変える方法はある。http://support.microsoft.com/kb/247815 HKLM\Software\Microsoft\WindowsNT\CurrentVersion\Console\TrueTypeFont 下に、00という名前の文字列を付け加えて、値をフォントフェイスにすればよい。複数のフォントを付け加えたい場合は、000, 0000,などというように、レジストリエントリの名前に、0を付け加えていく。

2007-05-13

一度生を受け、滅せぬ物のあるべきか

思へば、此世は常の住処にあらず。草葉に置く白露、水に宿る月より猶あやし。金谷に花を詠じ、栄花は先立て、無常の風に誘はるゝ。南楼の月をもてあそぶ輩も、月に先立つて、有為の雲に隠れり。人間五十年、化天の内を比ぶれば、夢幻のごとくなり。一度生を受け、滅せぬ物のあるべきか。これを菩提の種と思ひ定めざらんは、口惜しかりき次第ぞ

有名なところを超口語訳

つーか、人間ってせいぜい50年しか生きられねーよ。最下層の天使でさえも、八百年ぐらいはいきるっつーのによぅ。生まれたらそりゃ当然死ぬんだよ。これが定めか。なんつーこった

幸若舞『敦盛』(全文)
http://www.ikedakai.com/atsumori.html

2007-05-12

動画サイトの未来

ひろゆき氏、「ニコニコ」ヒットでも「動画は“来て”ない」

http://www.itmedia.co.jp/news/articles/0705/11/news117.html

まあ、PV数だけは無駄に稼いでいるが、大赤字だろう。トラフィックが膨大だからといって、広告料も上げてくれるわけではない。それもあるのだが、日本の動画の特徴が気になるところだ。ほとんどがアニメである。確かに、アニメといえば日本なのだが、それは所詮、作られたコンテンツである。自分で動画を作ってあげようという人が、あまりにも少ない。たとえば、YouTubeで最も人気の高い動画は何かというと。

つまり、個人が作った動画というのがほとんどない。たとえば有名なUnreal Gamer(キーボードクラッシャー)の動画は、狙って作られたものである。この少年が、別の動画でなにやら話しているものも、アップロードされている。こちらは普通に話しているだけなので、あまり人気はないが。

これは、誰でも作れるのだ。しかし、日本人はこういう動画を作ろうとしない。既存のアニメをいかに画質良くエンコードしてニコニコに上げるかにはこだわっても、自前でいかに面白い動画を作るかについては、まったく考慮しない。まあ、かく偉そうなことをいうからには、自分で作って見なければならない。そんなわけで一連の動画をここにリンクしておく。

http://www.nicovideo.jp/search/hito

2007-05-09

how do i use mencoder for two pass encoding

 さて、2パスエンコードを説明する。これまでのmencoderにはバグがあり、VP62の2パスエンコードがうまくいかなかった。.sstファイルが正常に出力されないのが原因である。これが、2chの有志により、直されたので、2パスエンコードができるようになった。ちなみに、CBRだと、バグがあってもできてしまったりする。公式にパッチは上げてくれるのだろうか。  それにしても、やはり、2パスはすばらしい。動き始めのブロックノイズが激減する。いままで2パスを敬遠してきたのは、mencoderだけで完結する方法がなかったからだ。
echo オーディオのビットレートを指定(kbps) 例:64 set Audiobitrate=64 REM ビデオフォーマット設定(出力拡張子で自動的に確定) set FORMAT=-of lavf set FOPT=-lavfopts i_certify_that_my_video_stream_does_not_use_b_frames REM 一応入力側の名前に合わせてみる set OUTPUT=-o "%~n1.flv" set INPUT="%~1" REM ビデオコーデック設定 set VCODEC=-ovc vfw REM 音声コーデック設定 set ACODEC=-oac mp3lame set ACOPT=-lameopts abr:br=%Audiobitrate% -af resample=44100 REM その他フィルタオプション(現状は上下反転+LanczosResize512x384)-ffourcc VP6F set EXTOPT=-vf flip,scale=512:384 -sws 9 REM 2pass用 set VCOPT=-xvfwopts codec=codecs\vp6vfw.dll:compdata=firstpass.mcf mencoder %FORMAT% %FOPT% %VCODEC% %VCOPT% %ACODEC% %ACOPT% %EXTOPT% %OUTPUT% %INPUT% set VCOPT=-xvfwopts codec=codecs\vp6vfw.dll:compdata=secondpass.mcf mencoder %FORMAT% %FOPT% %VCODEC% %VCOPT% %ACODEC% %ACOPT% %EXTOPT% %OUTPUT% %INPUT% あとは各自試行錯誤でもしてくれってことで。
 これが、2パスに必要なバッチファイルである。例の如く、自分好みに変えてある。さて、とりあえず試したい場合は、コーデックの指定を、vp6vfw.dll:compdata=dialogにすれば良い。設定ダイアログが表示されるので、それぞれ、Two Pass - First Pass, Two Pass - Second Passを選べば良い。しかし、それでは人間が応答しなければならない。私の理想は、無人のまま自働エンコードである。そこで、コーデックの設定を、保存しておく必要がある。これには、.mcfというファイルを生成する必要がある。このバッチファイルに添う形では、firstpass.mcfと、secondpass.mcfである。.mcfファイルはどうやって生成するか。それには、vfw2menc.exeを使う。次のように呼び出せば良い。
vfw2menc -f VP62 -d codecs\vp6vfw.dll -s firstpass.mcf vfw2menc -f VP62 -d codecs\vp6vfw.dll -s secondpass.mcf
それぞれ、1パス目、2パス目を設定する。このようにしておけば、人間が応答することなく2パスエンコードができる。

what niconico wiki's mencoder batch file doing?

前回、mplayerとmencoderについての概要を説明した。今回は、ニコニコ動画のまとめWikiにある、mencoderのバッチファイルが何をしているかを説明してみる。なお、今回は、mencoderのドキュメントを参照しつつ、読んで欲しい。 http://www.mplayerhq.hu/DOCS/man/en/mplayer.1.html

echo オーディオのビットレートを指定(kbps) 例:64 set /p ABITRATE=AudioBitrate: set Audiobitrate=%ABITRATE% REM ビデオフォーマット設定(出力拡張子で自動的に確定) set FORMAT=-of lavf set FOPT=-lavfopts i_certify_that_my_video_stream_does_not_use_b_frames REM 一応入力側の名前に合わせてみる set OUTPUT=-o "%~n1.flv" set INPUT="%~1" REM ビデオコーデック設定 set VCODEC=-ovc vfw set VCOPT=-xvfwopts codec=codecs\vp6vfw.dll:compdata=dialog REM 音声コーデック設定 set ACODEC=-oac mp3lame set ACOPT=-lameopts abr:br=%Audiobitrate% -afresample=44100 REM その他フィルタオプション(現状は上下反転+LanczosResize512x384)-ffourcc VP6F set EXTOPT=-vf flip,scale=512:384 -sws 9 mencoder %FORMAT% %FOPT% %VCODEC% %VCOPT% %ACODEC% %ACOPT%%EXTOPT% %OUTPUT% %INPUT% あとは各自試行錯誤でもしてくれってことで。

これが、FLV4enc_D&D.batの中身である。1パスの、重要な部分だけを抜き出してある。基本的に、最後のmencoderが重要なのだ。このバッチファイルは、FLVにエンコードして、ニコニコにうpするための、最小限のことだけをしている。これを理解して、自分で変更できるようになれば、さらに画質や音質を上げられるだろう。

まず最初のFORMAT変数には、-ofオプションを使い、どのフォーマットで出力するかが指定されている。明示的にflvを指定してもいいのだが、このバッチファイルではそれはしていない。次に、-lavfoptsオプションを使い、出力する動画が、Bフレームを使用していないことを明示している。現在、mencoderではBフレームの出力がサポートされていないからである。 VCODEC変数で、コーデックを指定している、これは、vfw(Video For Windows)を使う。つまり、vp6vfw.dllのことだ。次に続く-xvfwoptsオプションで、読み込むDLLファイルを指定している。また、コーデックの設定ダイアログを開くようにしている。コーデックの設定を自動化する方法があるのだが、それは2パスエンコードのときに説明するつもりだ。

余談だが、mencoderで、とうとう2パスエンコードができるようになったのだ。パッチがいつ、公式のMLに投げられるのか、不明ではあるが、diffは確保したので、いざとなればなんとでもなるだろう。私もUNIX環境のプログラミングを勉強すべきだろうか。

次は音声である。このバッチファイルは、いかなる動画ソースからでも、ニコニコに受け付けられるFLVを作成することを目的としているので、音声はエンコードされる。もし、自前でエンコードした音声がある場合、それを単にコピーすれば、再エンコードされずに、音質がよくなるだろう。FLVコンテナでは、無圧縮PCM、ADPCM、mp3をサポートしている。また、マイクで録音する際に、Nellymoser codecを使用しているようだが、このコーデックの仕様はよく分からない。現在のところ、オープンソースのデコーダーも見当たらない。 mp3へのエンコードは、-oacオプションで、mencoderに組み込まれているmp3lameを利用している。また、FLVコンテナは、 44.1kHz 22.05kHz 11.025kHzのいずれかのサンプリングレートでなければならないようなので、トラブルを防ぐために、-afオプションで、44.1kHzにリサンプルしている。ただし、このリサンプルは、次のEXTOPTで設定されている。ここが個人的に好きではないので、私の自前のバッチファイルでは、変更しているが。

さて、いよいよEXTOPT変数だ。ここにはまず、-vfオプションが指定されている。これは、ビデオフィルタという意味で、文字通りフィルタだ。 まず、flip、これは、VP6のデコーダであるVP6Fが上下反転した出力をするので、workaroundとして入れてある。最初から上下反転したフレームにしておけば、さらに上下反転して、意図通りにデコードされるという寸法だ。しかし、なぜこんなあまのじゃくな仕様なのだろう その次に、動画を512x384にスケーリングする。この解像度でなければ、SIMLEは再エンコードをしてしまうからだ。次に、-swsオプションで、スケーリングのアルゴリズムを設定してる。現在のところ11種類のアルゴリズムが実装されている。9というのは、lanczosアルゴリズムである。非常に品質のいいアルゴリズムとして有名だ。ほとんどの場合はこれでいいのだが、たとえばドット絵、ファミコンやスーパーファミコンなどの動画をエンコードするときは、4のnearest neighborがお勧めかもしれない。もちろん、エンコードする過程でかなり劣化するし、元ソースの画質にも影響されるので、どちらがいいかは、好みの問題ではある。また、先に説明したように、ここで音声リサンプルのための-afオプションが指定されている。 そのあとは、出力と入力のファイルを指定しているだけだ。

PS. やはり、バッチファイルを修正した。-afオプションと、%INPUT%にダブルクオーテーションがついているのを修正した。ダブルクオーテーションは、INPUT変数自体に含めるべき。

what is mplayer and mencoder and why i have to use them?

mplayerと、mencoderについて、説明を試みる。なお、これはニコニコ動画に動画をアップロードすることを前提に書いている。

mplayerとは、恐ろしく高機能な動画プレイヤーである。かなりの数の動画を再生できる。何がすごいのかというと、すべて自前でデコードしていることだ。しかし、もともとはLinux用のプログラムであり、Windowsで使う上では、必ずしも使い勝手や画質がいいとは言いがたい。基本はCUIである。ではなぜ、これがニコニコ動画にアップロードする上で、最適なのか。それは、mencoderの存在である。 mencoderは、mplayerとほぼおなじコマンドラインオプションを持っている。mplayerはプレイヤーであるし、mencoderはエンコーダーだ。 ニコニコ動画には、FLV形式の動画を直接アップロードできる。このとき、600kbpsで40MBの範囲に収まっていれば、再エンコードされずに、そのまま使われる。この制限は、かなり厳しい。

FLVというコンテナには、いくつかの動画形式を格納できるが、その中でも極めて、低ビットレートに置いても画質が優れているのが、On2 TecnologyのVP62だ。H263もそれなりにいいのだが、600kbps以下という厳しい制限では、VP62が圧勝してしまう。

さて、VP62にエンコードするには、ffmpegでエンコードするか、On2 Tecnologyのvfw(Video For Windows)コーデックである。vp6vfw.dllを使うしかない。ffmpegに実装されているエンコーダーはあまりよろしくないので、本家のvp6vfw.dllを使うことになる。mencoderは、それ自体で多数の動画形式へエンコードできるのだが、vfwコーデックを使うことも出来る。そのため、非常に使い勝手がいい。ちなみに、x86 Linuxで、Windowsのdllを使うために、非常に興味深いLoadLibraryの自前実装があるのだが、それはまた別の話。 それだけではない。mencoderは、その辺の安っぽい動画編集ソフトウェアよりも、よほど優れた動画編集能力を持っているのだ。まず、デコード、エンコードできる動画形式が多い。mpeg1/2/4はもちろんのこと、VOBなども問題ないし、ASF/WMA/WMV, QT/MOV/MP4, RealMedia, Matroska, NUT, NuppelVideo, FLI, YUV4MPEG, FILM, RoQ, PVAと、有名どころの形式は、余すところなくサポートしている。ffmepgに感謝すべきか。 また、基本的なフィルタも有しており、上下左右反転や回転はもちろんのこと、スケーリング、アスペクト比変更、ブラックバンドの追加、ノイズ除去、フレームレートの変更(単純な脱落から、フレームの合成まで)、テレシネ、逆テレシネ、シャープ、ブラー、インターレス解除ができる。とくにインターレス解除やスケーリングは、かなり多数のアルゴリズムを使うことが出来る。ロゴの削除なる機能もあるが、これをまともに使うのは難しそうだ。

と、ここまで説明すると、「おいおい、なぜCUIな貧弱ツールでフィルタなど使わなければならないんだ。この俺が使っているクールでイージーでGUIなツールでフィルタをかけたほうがいいじゃないか」と言う人がいるかもしれない。CUIであることの利点は、自分でコードを書いて、簡単にバッチ処理ができたりすることもあるのだが、なによりすばやいことだ。複雑なGUIでは、あるフィルタをかけるためには、メニューからフィルタの適用を選択し、ダイアログから目的のフィルタを選んで、パラメータを指定しなければならなかったりする。mencoderでは、-vfオプションを使うだけで、簡単に指定できる。たとえば、512x384にスケーリングしたければ、

mencoder -vf scale=512:384

とすれば良いし、400x300にスケーリングして、黒帯をいれて中央に表示し、512x384にしたい場合は、

mencoder -vf scale=400:300,expand=512:384

とすればよい。また、インターレスをLinear blendで解除しつつ、512x384にスケーリングするには、

mencoder -vf pp=li,scale=512:384

となる。非常に簡単だ。ちなみに、フィルタは並んでいる順番で適用される。インターレス解除は、一番最初に行っておかないと、泣きを見ることになる。

また、「俺のクールでイージーなGUIツールには、フィルタのプレビュー機能があるぜ」という人もいるかもしれない。この点も問題はない。なぜならば、mplayerとmencoderは一心同体、mencoderのフィルタは、mplayerでも同様に使える。だから、mplayerでリアルタイムにフィルタをかけつつ再生して、効果を確かめることもできる。 とはいっても、最高に高画質を目指す人から見れば、mencoderのフィルタは貧弱かもしれない。しかし、私のように、多数の動画にたいして、ある程度の画質を維持しつつ、寝ている間にエンコードしたいという人間には、最適なのだ。

次回は、ニコニコwikiで配布されている、mencoderを使うバッチファイルが何をしているかについて、解説する。タグ、mencoderで、一覧を見ることができる。

2007-05-08

what do we trust in the TBS

 時刻表示は信頼できるだろう。よほどのことがない限り、誤差はかなり低いと考えられる。  しかし、生放送を数分ずらしてリアルタイム編集しつつ放送とかやりそうだけど。

2007-05-04

プロセス終了時にメモリを解放すべからず

http://blogs.msdn.com/oldnewthing/archive/2007/05/03/2383346.aspx  よく、OSが解放してくれるから、プロセス終了時にはリソース解放などをしなくてもいいという意見に対して、「いや、できる限りすべきだ」という人が居るが、場合によりけりということらしい。いや、別にしてもいいのだけれど、DLL_PROCESS_DETACHの中でやるなということで。  プロセスが終了するとき、Windows XPがどのような処理をするか。ExitProcessが呼ばれたとき、ExitProcessを読んだスレッド以外のすべてのスレッドは、終了される。スレッドが何をしていようがお構いなしだ。つまりは、TerminateThreadに等しいということだ。MSDNではTerminateThreadは使うべきではないとしつこく警告されているが、一体何がまずいのか。実は、TerminateThreadとは、スレッドが何をしていようと、強制的に終了させるのだ。もし、強制終了されるスレッドが、クリティカルセクションに入っていた場合、そのクリティカルセクションはロックされたままになる。これの何がまずいのかというと、スレッド間で排他をとるヒープを使っていて、まさにヒープからメモリを確保、解放するときに終了されると、ヒープがロックされたままになる。  さて、ある「賢い」DLLは、DLL_PROCESS_DETACH通知が送られたときに、確保したリソースを解放しようとする。しかし、そのリソースに排他的にアクセス中のスレッドが強制終了された場合、リソースを解放しようとすると、例外を投げてこける。結果的にプロセスは終了するのだが、なんとも汚い終わり方になってしまう。  そこで、プロセス終了時のDLL_PROCESS_DETACHの中では、何もするな。何も「賢い」ことをするな。ただreturnせよ。リソースの解放はOSにまかせろ。  ただし、動的にDLLがアンロードされる場合は、この限りではない。まだプロセスは動き続けるのだから、リソースを解放しなければ、リソースリークになってしまう。なんともやっかいだ。

Time flies when you're enjoying yourself

 光陰矢のごとしとはよく言ったものだ。実際早い、早すぎる。私とて、もう二十歳なのだ。後せいぜい五十年ないしは六十年ぐらいしか生きられない定めなのだ。しかも50年とは、あくまで生存可能な時間であって、有意義に生きられる時間ではない。最新の技術にいつまでついていけるだろうか。あと20年、いや10年もないかも知れぬ。そう短い時間では、何も極めることができないだろう。  何ということだ。人間はたったの百年足らずしか生きられぬのか。いかに富や名声を得ようとも、歴史教科書の片隅に、「かくかくしかじかなる有名な男がいた」程度の扱いしかされぬのだ。今、各の如く、考え、悩み、先人のしたように、文に綴りてみんとするこの瞬間の思想は、決して伝えられないというのだろうか。

2007-05-03

High Quality Dressed Up Car

 車の免許を取るために、二段階技能で外を走っていたとき、ふと、前の車のリアウインドウにでかでかと張ってある、ステッカーが目に付いた。そこには、High Quality Dressed Up Car(超めかした車)と書いてあった。ああ、自画自賛ここにきわまれり。  あるいは、「大安売り」などと書いてあるTシャツを着ている外人と、似たような感覚なのだろうか。