ffmpegメモ

19 12月

参考にしたサイト

ffprobeで動画を解析する
http://fixedpoint.jp/ffmpeg/ffmpeg-doc.html
ffmpeg で指定秒数を切り出して動画を時間で分割する
ffmpeg how to control fps tbr tbn tbc parameters

アップロードされた動画ファイルをデーターベースに保存することを考えています。多様なサイズやクオリティーのファイルが送られてくると想定して,サイズ等の変換をします。
 最初に,比を保ったままサイズの変更をするために,動画ファイルの縦横のサイズを得たいのですが、以下では ffprobe を使用します。余計な出力をしないために -v quiet -hide_banner を付けています。

$tmp="ffprobe -v quiet -hide_banner -show_streams -print_format json test.webm";
$str = shell_exec($tmp);
$tmpjson = json_decode($str,true);
echo $tmpjson['streams'][0]['width']."\n";
echo $tmpjson['streams'][0]['height']."\n";

変換する場合のオプションをあげます。-i は入力ファイルの指定、-strict -2 は音声コーデックのaacが実験的な実装ということでつけています。-y はファイルの上書きを確認しないため、-s はサイズの指定ですが、数字は偶数でないとエラーとなるようです。-t は秒数の指定で、ここでは動画の先頭から30秒間を変換するように指定しています。長ければ変換が途中で打ち切られますが、30秒より短い動画を変換してもエラーとはならず、元のファイルの長さと同じ長さになります。

ffmpeg -v quiet -hide_banner -i test.webm -strict -2 -y -s 640x428 -t 30 sample.mp4

WEBRTC の技術を利用して、動画を投稿するサイトを作成してみました。ブラウザからカメラとマイクを制御して動画を取り込みます。

QA

環境によるのですが、動画の変換にかなり時間がかかる場合があって、windows7 上で、同じ firefox でもパソコンによって上手くいったりいかなかったりします。時間がかかる上に、出力ファイルのサイズも大きくなります。両方の場合の、ブラウザが作成した元動画を ffprobe で調べてみました。下記がその出力結果です。

Input #0, matroska,webm, from 'img13':
  Metadata:
    encoder         : QTmuxingAppLibWebM-0.0.1
  Duration: N/A, start: 0.001000, bitrate: N/A
    Stream #0:0(eng): Video: vp8, yuv420p, 640x480, SAR 1:1 DAR 4:3, 1k tbr, 1k tbn, 1k tbc (default)
    Stream #0:1(eng): Audio: opus, 48000 Hz, mono, fltp (default)

Input #0, matroska,webm, from 'img19':
  Metadata:
    encoder         : QTmuxingAppLibWebM-0.0.1
  Duration: N/A, start: 0.001000, bitrate: N/A
    Stream #0:0(eng): Video: vp8, yuv420p, 640x480, SAR 1:1 DAR 4:3, 28.75 fps, 28.75 tbr, 1k tbn, 1k tbc (default)
    Stream #0:1(eng): Audio: opus, 48000 Hz, stereo, fltp (default)

上方の img13 が上手くいかない場合、下方の img19 が上手く変換される場合です。比較すると、fps に関する情報が欠落していることが分かります。そこで根拠はないのですが、fps がおかしな値の場合には強制的に30に設定するようにしました。”-r 30″ という部分がそうです。

ffmpeg -v quiet -hide_banner -i img13 -r 30 -strict -2 -y -s 640x480 -t 60 img13.mp4

これで変換が速くなりました。