Archive for 2010年10月

Panasonic BL-C131 の録画 (3)

2010/10/08

続き。

前回までで、正しい映像を保存することができたので、次は音声を何とかする。

音声は、G.726というコーデックのADPCMで送られてくるのだが、これは、openRTSPで保存したままの状態では、簡単には再生できない。mplayerに食わせてみたとしても、エラーを吐いて終了してしまうし、FFmpegで、codecとしてg726を指定してやっても、そのファイルを認識できないので、他形式に変換しようとしても不可能である。

ではどうするかというと、ここで紹介されている、g72x++という専用変換ツールの助けを借りる。これをビルドして、decode-g72xという実行ファイルを取得しておく。

この、decode-g72xを使用すれば、G.726のファイルを生PCMファイルに変換できるので、これを改めてFFmpegに通して、wavファイルとして保存する。

cat audio-G726-32-1 | decode-g72x -64 -l -L | ffmpeg -y -f s16le -acodec pcm_s16le -ar 8000 -ac 1 -i - audio-G726-32-1.wav

ここまでの手順で、正しく、また処理可能な映像と音声ファイルが出来あがったので、これらを結合することが可能となった。前回、映像をx264にエンコードしたので、これはそのまま使うことにして、音声をaacにしてmp4ファイルを作成するとするならば、以下のようにする。

ffmpeg -y -i video-MP4V-ES-2.mp4 -i audio-G726-32-1.wav -vcodec copy -acodec libfaac -ar 44100 -ab 16000 -ac 1 video.mp4

ここで作成された、video.mp4が最終的な目当てのファイルとなる。きちんと映像と音声の同期のとれた動画となっているはずだ。

Panasonic BL-C131 の録画 (2)

2010/10/04

続き。

さて、前回の方法でカメラからの動画と音声が保存できた。あとはこれをマルチプレクサにかけて単体の動画ファイルを得ればよい、というほど甘い話ではない。それでイケるのであれば、openRTSP自体にマルチプレクサが内蔵されているので、それを使えばよいだけの話。

まずは映像。これは普通のMPEG4なので、このままでも適当なプレイヤーソフトで再生できる。できるのだが、何故か微妙に早回しになってしまう。

これは、MPEG4のメタデータとしては、30fpsで記録してあることになっているものの、実際には、22.5fpsでしかないことに起因している。なのでフレームレートを変換してやる必要がある。たとえばmplayer(multimedia/mplayer)で再生するなら次のようにすれば、任意のフレームレートで再生できる。

mplayer -fps 22.5 video-MP4V-ES-2

再生するだけならこれでよいのだが、今回は、最終的に正しい動画ファイルを作成する必要があるので、変換した結果をファイルに落とさなければならない。

そこでFFmpegを使うわけなのだが、FFmpegは、通常の動画ファイルに対してフレームレートの上書きができない。例えば、次のようにしたとしても、フレームレートは変換されないのだ。1

ffmpeg -r 22.5 -i video-MP4V-ES-2 -vcodec mpeg1video -an video-MP4V-ES-2.mpg

ではどうするかというと、一旦rawvideo形式に変換する。rawvideoにしてしまうと、そのファイル中にはフレームレートとかのメタデータが含まれないので、そこから別の形式にエンコードするときには、コマンドラインで指定したものが有効になるからだ。

しかし、rawvideo形式だと、サイズが非常に大きくなるため、本当にファイルを作ってしまうと大変なことになる。そこで、2つのFFmpegをパイプで繋ぎ、一気に目的のフォーマットに再エンコードしてしまうとよい。例えば、x264なmp4にするなら、次のようにする。

ffmpeg -y -i video-MP4V-ES-2 -f rawvideo - | ffmpeg -y -s 640x480 -r 22.5 -f rawvideo -i - -vcodec libx264 -an -f mp4 video-MP4V-ES-2.mp4

2つのコマンドが同時に走るため、画面出力が悲惨なことになるが、とりあえずこれで、正しい動画が作成できた。

さらに続きます。

  1. FFmpegの古いバージョンでは効いたりはするようではある []