2009年04月19日

避けては通れない動画処理(flvやmp4再生)

UNIXにはMCIもDirectShowもない。現時点ではコマンド渡しでプレーヤーを起動するくらいしか出来ない。
これは避けては通れない道なので取り敢えず動画再生の道筋をつけた。
動画処理には二つのアプローチがあると思う。
素材としていろいといじるというアプローチと
ソフトとハードと最大効率でいかにスムーズに再生するかと
adobeのFlash playerの場合、明かに前者「のみ」なのだが
youtube鑑賞などは後者の方が好ましい。
道筋としてffmpegかgstreamerかの二択なのだが
今回はなんとかffmpegのライブラリーを使ったサンプルコードをビルドすることが出来た。

今回はhttp://ffmpeg.org/のリンクにある
http://www.dranger.com/ffmpeg/
チュートリアルのコードをビルドしただけだが
tutorial4以降はpstrncpyを使っていたのでstrcpyに書き換えた。

tutorial5ぐらいからちゃんと再生するようになるのだが
終了処理はtutorial2あたりのがちゃんとしている。

ビルドするときは

gcc -Wall -pipe -O2 \
-I/usr/local/include/SDL -I/usr/local/include/ffmpeg -I/usr/local/include \
-pthread -L/usr/local/lib \
-lavutil -lavformat -lavcodec -lSDL \
-o tutorial04 tutorial04.c


とした。オリジナルは「-lm 」がついているのだが
nvidiaの場合libGL.soが違うバージョンのものをくっているらしいのではずした。
というか-lSDLを入れればもれなくOpenGLもついてくるから「-lm」はいらないということのようだ。
他に「-lz」もついてたのだが多分既に組まれているだろうと思い外したが動作に影響はなかった。

このチュートリアルはSDLベースでffplayもSDLなのは
やはりSDLが使いやすくクロスプラットフォームであるからということだろう。
動画再生なので当然の事ながらスレッドなども使っているが実際pthreadであっても
コード上はSDLを使っている。
この部分のフレームワークで競合するのはOSのライブラリであったりglib2であったりだ。
ffplayもこのコードもSDL_Mixerを使わずに音声再生までこなしている。
サウンド部分についてOpenALとSDL_Mixerの選択肢で悩んでいるのだが
両方選ばないという選択肢もあるわけだ。

基本フレームワークの選択の理由としてSDLがプラス1ポイントというか
まずSDLである程度組んでからベターがあればそちらに移れば良いか
もうしばらく考えてみたい。

で動画の再生部分だがYUVでのオーバーレイで
SDL_Overlayを

SDL_CreateYUVOverlay(pCodecCtx->width,
pCodecCtx->height,
SDL_YV12_OVERLAY,
screen);

として作っているがポイントの様で
これの上に何かやったらどうなるかに興味があるが
とりあえずSDL_SetVideoModeと違うサイズにすることはできた。
これがどの程度ハードウェア支援を受けられるのかわからないのだけれど
mpeg4をスムーズに再生するのだから使わない理由はない。
テクスチャーやFlashのムービークリップとして低速なアプローチはあったとしても
いわゆる動画再生サイトなどでユーザーがアプリケーションのメニューからでも
低負荷再生を選べるようにすれば良いと思う。

動画もどういう方向にいくかわからないけれど
取り敢えずmp4とmp3音声flvが再生出来れば
一般用ゲームプレーヤーとしても充分ではないだろうか。

一気ににffplayよりましなものが作れそうな気配になった。


ラベル:動画
posted by Xo_ox at 19:32| Comment(0) | FreeBSDアプリ | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。