ムービーテクスチャ実装の動画プレイヤー

ここ数日、OpenGL + OpenAL + FFMPEG API(+ boost)で動画プレイヤーを作り始めて、悪戦苦闘している。


実は作るのは二回目なのだが、一回目に作ったものはパフォーマンスが悪く、ちょっとでも重い(コンソールにエラーログが大量に出るやつとか)動画を再生すると音がプチプチ切れてしまう上、コーデック自体は対応しているのに、H.264 + aac が再生できない(落ちる)という欠点まで抱えていた。
今回はそのリベンジとして、前に作ったもののコードを流用しつつ、設計を大幅に変えて作っているわけなのだが……。


今回も出来に関しては、あまり自信がない。
パフォーマンスは大幅に上がったし、H.264 + aac も再生できるようになったのだが、まだ課題が残っている。


というわけで、ここにメモしておこうと思う。


・ループ再生を組み込んだが、動画の末尾まで再生し終わると固まる


おそらく自作のスレッド間通信インターフェースが悪さをしているのだろう。
終了パケットをキューに入れても、それが読み取られていないようだ。
このキューはリングバッファで実装されているのだが、負荷が高くなると、パケットを上書きするようになっているので、あまり確実性が無い。
専用の終了フラグを持たせることにする。


・テクスチャが飛ぶ


BGM と同期させるとき、テクスチャをバッファリングしないといけない(※)のだが、キューの数が足りなくてテクスチャが上書きされてしまう。
かといってキューを増やしすぎると容量を大きく食ってしまう。
なので、最初だけデコード前の AVPacket をリスト化して、BGM側の準備ができたらまとめてデコードするようにする。


※ 音声は必ず 192000 バイト読み取ってからデコードしないとおかしな音になってしまう


・長い動画を再生すると音声が飛ぶ


多分キューの長さだと思うが、キューをかなり長くしても音飛びが発生するので制御方法を変えたほうが良いだろう。


・パケット生成部分を自作メモリ管理に切り替える


今は生の new, delete を使っているので、長時間動かしているとメモリが断片化してしまう。
自作メモリ管理に切り替えることで、断片化を防ぐことができる上、パフォーマンスが1.5倍〜2.0倍ぐらいに上がる。
作ったやつがどこにあったのか忘れてしまったので、また作らないとだめだが……。面倒臭い。


・たまに不安定な動作をする


メモリバリア関連だと思われる。
漏れのないようにしなくてはいけない。
マルチコアCPUでマルチスレッドは大変だ。


ソースコードが汚くなってきた


この手のリアルタイムな処理を扱うプログラムは、油断するとすぐにコードが汚くなってしまうので、パフォーマンスを下げすぎない範囲でのリファクタリングが必須だ。
あとで読み返したときに、自分で自分のプログラムを解析しなくてはいけなくなる。




参考にしたURL
http://www.dranger.com/ffmpeg/tutorial01.html


プログラミングに必要なのは気合と忍耐力と失敗を恐れない勇気だ。
作成中に何回かOSごとハングさせたが気にしない。