10月2008

QuickTimeでデコードしてffmpegでエンコード

ffmpegのflvデコードの対応がいまひとつだったので、ffmpegXにならって、movtoy4mを使ってデコードし、それをffmpegでh264にエンコードしてもらいました。movtoy4mは動画だけなので、音声はmovtowavでデコードします。このmovtoy4mとmovtowavはどちらもQuickTimeを使ってデコードするので、QuickTimeで再生できるすべての形式に対応できるはずです。

まず、movtowavで音を抽出

movtowav sm2154871.flv -o sm2154871.wav

次に、movtoy4mでデコードしつつ、ffmpegに流し込みます。

movtoy4m -w 480 -h 320 -a 16:9 -o y4m sm2154871.flv | ffmpeg -f yuv4mpegpipe -i – -vcodec h264 -i m2154871.wav -acodec aac -ab 128k -coder 0 -level 13 m2154871.mp4

このやり方なら、おそらくQuickTimeで再生できるすべての動画をiPhoneに入れることが出来ます。movtoy4mでデコードした時には生のデータが出力されるので、一旦ファイルに書き込むことはお勧めできません。したがって、パイプで繋いでやるのが良いです。まだよく調べてないので理由は知りませんが、iPhoneに動画を入れるには、-coder 0と-level 13を指定しないといけません。

もちろん、上のようにflvを変換したければ、QuickTimeでflvを再生できる状態にしておかなければなりません。Perianなどのプラグインでも入れておきましょう。

movtoy4m

ビデオカード

ちょっとビデオカードについての記事を書く機会があったので、適当にこのブログにも掲示しておきます。


ビデオカードは、他にもグラフィックボード、グラフィックスボード、グラフィックカード、グラフィックスカードと呼ばれる場合もありますが、ここではビデオカードで統一します。

概要

 ビデオカードは、コンピュータで処理する計算のうち、画面への描画に関する処理をするために作られた装置である。したがってビデオカードでは、描画に関する処理を前提として設計されているため、画面への描画を高速に処理することができる。通常の計算処理をしているCPUと独立することで、CPUへの負担を減らすことや、CPUでは不可能な描画処理を実現する。

 ビデオカードは、大きく分けて2つの部分から成り立っており、1つがGPUと呼ばれる計算処理をする部品であり、もう1つは、計算結果や計算に必要なデータを保持しておくためのメモリ部分である。この関係は、CPUとメインメモリとほぼ同じであり、見方によっては、ビデオカード自体がもう一つのコンピュータと見ることもできるであろう。

背景

 コンピュータの構成要素に、必ずしもビデオカードが必要というわけではなかった。しかし近年、メディアやゲームの発達とともに、コンピュータに要求される描画処理能力が高まっていった。特にゲームの分野では、3D空間の処理やリアルタイム性を実現するために、高速な描画が必要とされるので、多くのパソコン用のゲームではビデオカードが必要とされている。ちなみに、家庭用ゲーム機も当然ながらビデオカードを搭載している。

 また、地上デジタル放送のような高画質でデータ量の少ない動画、すなわち圧縮率の高い動画では、再生するのでさえも大量の処理が必要となるため、最近ではそのような動画についても、ビデオカードが再生を支援するようになっている。

今後

 これまで、ビデオカードは描画処理だけのために使用されてきたが、最近、ビデオカードを、もっと汎用的な計算に活かそうとする技術が開発されつつある。というのも、ビデオカードは、ビデオカードによる描画処理が必要でない時には働いておらず、パソコンを使用している多くの時間がその状態だからである。もともと描画処理を前提として設計されたビデオカードに、通常CPUで行っているような処理をさせることは、それほど簡単なことではないが、ビデオカードで汎用的な処理をさせることが実現できれば、もっとハードウェアを効率よく使用できることになる。代表的な事例として、Apple社が中心となりOpenCLと呼ばれる技術が開発されており、次期Mac OS XのSnow LeopardにOpenCLの技術が組み込まれる予定となっている。

勝手にヘルプの形式でも考えてみる

そろそろAB5のヘルプの形式を考えてみるのも悪くないと思うので、ちょっと考えてみた。というよりも、個人的にはADCのヘルプが非常に見やすいので、それを真似てみたくなった。ADCには、主にガイドとリファレンスに分かれている。ガイドを見れば、これをするためには、どういったものを使って、どういった考え方で使えばいいのだろうか、ということが主に示されている。リファレンスは、単なるクラスリファレンスであるが、サンプルコードはここに含まれない。

ところで、MSDNは見づらいと常々思っているのだが、その理由を挙げてみよう。

  • リファレンスで、関数ごとに1ページ使うのはどうかと思う
  • リファレンスが用途別に並んでない
  • 全体が見渡せる資料がどこにあるかわからない
  • わけのわからないページに飛ばされることが多い

一番上はメリットもあります。たいていの関数にサンプルコードが付いているので、それを見ればすぐに使い方がわかる場合もあるからです。とまあ、こんなこともふまえつつ、ちょっとプログラミングガイド的なものを、サンプルとして書いてみたわけです。

ストリーム プログラミングガイド

サンプルとして書いたので、書きかけだったり、少しいい加減な部分があるので、あんまり本気で読まないほうがいいです。

今日これを書いてわかったことは、さすがに実装するほうが時間はかかると思いますが、ヘルプを書くのにも、相当に時間と労力を必要としそうです。

私の考えるActiveBasic5のリリース地点

実はAB5のリリース時期や要件があまり議論されたことはなく、終わりの無い開発になっているように見えますが、ある程度なんとなく決まっている感じもします。最近だいぶAB5が見えてきた気もするので、このあたりで私の考えるAB5のリリース地点を箇条書きにしてみようと思います。

コンパイラ,エディタ

  • GCのパフォーマンス改善
  • プロジェクトエディタの作り直し

ライブラリ

  • 基本的なデータ構造のサポート
  • 文字エンコーディング
  • ファイル関連
  • UI
  • ネットワーク
  • XML
  • 初心者用ライブラリ

コンパイラのほうは、今まで実装された物が多すぎて忘れましたので、今足りない物だけを書いています。今のGCのパフォーマンスはかなり悪いので、どうにか解決しなければなりません。エディタは全面的に書き直しになることでしょう。余裕があればAB5で作りたい物です。

ライブラリのほうは、基本的なデータ構造とファイル関連は、もうほとんど実装されています。XMLとUIもまあまあ進んできていて、文字エンコーディングもベースの部分はできている感じです。ネットワークは、このブログでもお伝えしているように、私が現在実装中です。ソケットからHTTPまで持っていくつもりです。クッキーも用意したいです。

初心者用ライブラリというのは、完全に私の頭の中から出てきた物です。プログラミングを初めて学ぶ人は、まずConsoleの標準入出力で学んでいくと思いますが、Windowsで標準入出力をやっていても、かなりつまらないことは多くの方が経験済みかと思われます。かといって、いきなりWindowsプログラミングに走るのも、ちょっと段差が大きい気がします。

そこで、その中間に位置するようなライブラリを作ってみたいわけです。イメージとしては、ウィンドウ作成部分を省いて、簡単に文字,画像や図形をウィンドウに描画できるようなものです。キーボードやマウスなどのイベントにも対応します。やはり、文字ではなくてグラフィックを操れると、多少面白いプログラムにはなるので、こういうものを用意できたらいいなと考えています。

と思ったものの、今作成中のUIもだいぶ簡単にWindowsプログラミングが出来るようなものなので、そんなものは必要ないのかもしれません。

マルチプラットフォームでゲームを開発するならSDL

基本的にカテゴリで「未分類」になってしまうようなブログネタは避けているので、最近いろいろありそうでSDLばかり触っていたばかりに、ブログの更新が相変わらず停滞気味です。しかし、さっき本屋で良さそうな本を見つけたので、「Book」のカテゴリとして更新です。

スクリプト言語による効率的ゲーム開発 C/C++へのLua組込み実践 (GAME DEVELOPER)
4797348550
浜中 誠


Amazonで詳しく見る
by G-Tools

ゲーム開発の書籍は色々出ていますが、ゲームのシステム全体のロジックについて考えたい場合は、これが一番良いかもしれません。ゲームプログラミングでの悩みどころと言えば、ゲームの進行をどうやってプログラムしていくか、というところだと思います。このゲームの進行の部分は、上から下へ進む単調なプログラムとして書けないことは、一度ゲームを開発しようと思ったことのある方には理解できるでしょう。そこでスクリプト言語の登場です。この本を読めば、このゲームの進行をどのように解決していくか、その糸口がつかめることでしょう。

また、この本でスクリプト言語の使用を推奨している最大の理由は、動的にゲームの調整が出来る点です。細かいチューニングをして、ビルドを繰り返していれば、大変な時間がかかっています。この本には、スクリプトを動的に読み込むなどして、それらを解決する具体的な方法が提示されています。

この本のサンプルは、意図的に思える程にゲームのほとんどの部分をスクリプト言語に落とし込んでいます。ここまでスクリプトに落とし込む設計しても悪くはないのか、と思いつつ読みました。ただし、もちろんパフォーマンスとのトレードオフなので、そのへんのバランスについても、ある程度この本で書かれています。

一応注意書きとして「ゲーム作りたいけど、全く見当もつきません」といった方が読む本というよりは、「ゲーム全体の設計が今ひとつしっくりと来ない」といった悩みや、本のタイトル通りの要望をお持ちの方に大変お薦めできる本です。

ところで、この本に書かれているサンプルにはSDL+OpenGLが使われています。これらはほとんどのプラットフォームで動作するので、Macでもゲームを動作させたいなら、このSDLを使うのが一番速い解決方法かと思います。ちなみに、今回紹介した本の中では、これらSDL+OpenGLの解説はほとんど無いので、その辺り勘違いしないように注意してください。

ちなみに、私はそれほどゲームに興味はありません。

ABユーザーへお知らせ

お知らせというほどの知らせでもないのですが、最近C++とかffmpegとかいじった結果がどれも中途半端で、ブログのネタになるほどのものでもなかったので、とりあえずのつなぎとしての記事です。ちなみに、今日はMono 2.0がリリースされたことをiPhoneのRSSで知り、わくわく感を胸に秘めて家に帰りましたが、肝心の実行できるちょうどよいサンプルが見つからなかったので、残念ながらこれも記事に出来ず。頑張ればPaint.NETがだいたい動くレベルまでプロジェクトは進行しているそうです。

さて、どうでもよい話はここまでにして、最近NoWestさんのブログがdev.activebasic.com内に移動したようなので、一応こちらにリンクを貼っておきます。

なんちゃないにゃ

こちらの記事で最新のActiveBasic5.0を試す方法が載っているので、先進的なユーザーさんや、5.0のリリースを待ちきれない人は、ぜひ試してみてください。
最新のActiveBasic5を試す

さらに、詳しい開発状況はこちらで知ることも出来ます。他にも、wikiのトップページにABのミーティングの議事録があったりするので、気になる方は見てください。
タイムライン – ablib

とは言っても、まともなドキュメントなしに使える人は、そうそういないと思われます。ドキュメントの方は5.0リリース時には充実させる予定ですので、今はライブラリ開発に時間を費やすつもりです。

そういえば、「ライブラリ開発ってどこを開発してるんですか?」ってユーザーさんも中にはいると思うので、一応言っておこうと思いますが、ab5.0/ablib/src/Classesの中のクラス群が、おもにライブラリの部分となります。System内とCollections,IOあたりに結構使える物がありますので、たまにブログに書かれるサンプルコードをたよりに、使ってみるのもよいかもしれません。また、だいたい.NET Frameworkと同じになっているので、msdnのリファレンスがだいたい使えます。ただし、実装されているクラスやメソッドをよく確認してから使いましょう。
System.Collections.Generic 名前空間
System.IO 名前空間

ソースコードに直接リファレンスが書かれているクラスも多数ありますので、とりあえずライブラリ内のクラスを片っ端から開いていくのも良いかもしれません。