GR-PeachでQuickTime動画を再生するプログラムを作りました.
動作の様子はこちら
概要
GR-PeachでQuickTime動画を再生するプログラムです.
ソースコードはこちら
https://developer.mbed.org/users/mtkrtk/code/MovPlayer/
Audio CameraシールドとLCDシールドを使っています.
上に載せた動作動画ではAudio Cameraシールドに接続したUSBメモリから動画を読み込み,音声も同シールドのLine Outから出力しています.
その出力を片方だけTDA7052ATで増幅(というより音量調整を兼ねたバッファ)し,スピーカに流し込みました.
Audio CameraシールドがなければGR-PeachのUSB0にUSBメモリを接続し,I²S接続したオーディオDACから音声を出力することもできます.
対応する動画ファイルは以下の条件を満たすもののみです.
コンテナフォーマット | QuickTime(拡張子.mov) |
---|---|
映像コーデック | Motion Jpeg 480x270 30fps 約6000kbpsまで |
音声コーデック | Linear PCM 16bit little-endian 44100Hz Stereo |
USBメモリのルートに配置されたファイルのみを読み込みます.
また,読み込み速度にはUSBメモリの性能が露骨に効いてきます.
手元にあった中で一番性能の良かったS○ny製(○は伏字)のUSB3.0対応のもので約6000kpbsの映像まで再生できました.
使用方法
動画のエンコード
かなり限られた条件の動画しか再生できないので,適切にエンコードすることが大切です.
ffmpegを使う場合
ffmpegが使える人であれば,次のコマンドで一発です.
$ ffmpeg -i <入力ファイル> -ar 44100 -acodec pcm_s16le -s 480x270 -vcodec mjpeg -q:v 3 -movflags faststart -threads 4 -vf fps=30 <出力ファイル>.mov
ここで,-q:v 3はJpegの品質を指定するオプションで,2を指定すると最高画質,数字が大きくなるごとに低画質になります.
経験則として,3を指定するとちょうどいいファイルが出力されました.
XMedia Recordを使う場合
以前Windowsで使っていた動画変換ソフトXMedia Recordを使った方法も書いておきます.
プログラムの書き込みと実行
上に掲載したソースをmbedのオンラインコンパイラもしくはオフラインのGCCARMでコンパイルし,普通に書き込みます.
USBメモリ上の動画ファイルが列挙されるので,選択して再生します.
再生終了後は動画の最終フレームで停止するので,画面をタッチすれば選択画面に戻れます.
実行すればインターフェイスはなんとなくわかってもらえると思います.
わからなかったら動画をみてください.
USBメモリの扱いは,この辺りを参考にしてください.
https://developer.mbed.org/teams/Renesas/code/GR-PEACH_Audio_WAV/
あと,main.cpp内のマクロUSE_TLV320を消すとSSI5につながったBU9480Fが動作するようにしました.
既知のバグ
以下は存在が確認できているものの原因がよくわからず放置したバグたちです.
- ときどき世紀末演出が入る(映像が乱れる)
- ファイルによって道路工事をし始める
- 運が悪いと動作が止まる
- ファイル名が右に寄ってしまう
- オンラインコンパイラだと再生後に砂嵐が発生する
ときどき映像にノイズのようなものが乗ったり,数フレーム先が描画されたりします.
なぜかファイルによっては音声にクリック音が入ります.
しかも左チャンネルだけ入ったり,よくわかりません.
運が悪いと動作が停止します.
さらに運が悪いと連続で停止します.
しばらくするとなぜか直ります.
x座標を0に設定しているにもかかわらず,ファイル名が画面中央あたりに表示されます.
まさかx軸だけ中心が原点なのかと思い負の数を指定したところ,案の定右に吹き飛びました.
オンラインコンパイラ(ARMCC)でビルドすると再生後音声に数秒間のノイズが出力されます.
P.S. okadaさんもこのくらいやってください愛が足りませんよMP3デコーダICなんて甘えたものに頼って割れた音出すだけじゃだめです悔い改めてください
コメント
コメント一覧 (2)
この記事の筆者ではないですが、管理人(兼当ブログで紹介しているロボットの製作者)のTADAが返信します。
質問に「どのロボットのどのモータか」が書かれていませんが、当ブログで紹介されているロボットは全てmaxon RE16(118725)ですので、それを前提とします。
PWM周波数は20kHzに設定し、デューティ比15%から85%までの間を使用しています。
詳細はSTMicroelectronics社のVNH5019 Datasheetを参照してください。
このモータは、端子間インダクタンスが非常に小さいのが特徴です。従って、電気的時定数も非常に小さいため、PWM周波数もある程度高く設定する必要があります。
こちらの詳細は、maxon motor社の技術情報発信サイト「マクソンアカデミー」に、詳細な計算方法が紹介されていますので、確認してみてください。
計算によると、電流平滑化を期待できるPWM周波数は、最低でも60kHz程度です。
しかし、私が使っているモータドライバIC(VNH5019)は、PWM周波数の上限が20kHzであるため、PWM周波数は20kHzとしています。