Ffmpegを利用してflvビデオのサムネイルとビデオ時間のコードを取得します。
問題の説明fliv動画のサムネイルと動画の時間を取得します。 Googleは、Ffmpegを使ってビデオを得ることができるという情報を半日発見しました。まず、FFMEPG を紹介します。
ここで簡単に説明します。FFmpegはオーディオとビデオを録画、変換、ストリーミングするための完全な解決策であり、リードするオーディオ/ビデオコーデックのセットです。公式バージョンのffmpegは、rmvbとrmフォーマットには対応していません。しかし、多くの解決方法があります。
FFmpegの公式サイトはhttp://ffmpeg.mplayerhq.hu/です。
中国語Wikiはhttp://www.ffmpeg.com.cn/で、資料が多いです。
一実装FFMEPG
オペレーティングシステム:centos 6
FFMEPGをたくさんインストールした文章を探しましたが、基本的にはコメントがないので、そんなに多くのパッケージをインストールする必要があります。また、上のステップをインストールするといつも問題が発生します。最後にホームページを探して、ちゃんと見ます。確かに公式資料はとても使いやすいです。これからは必ずホームページの資料を優先して見ます。
FFMEPG自体はflv形式をサポートしていますので、つまり今はどのプラグインをインストールする必要はありません。FFMEPGをインストールするには二つの方法があります。
以下はインストール手順です。
セットアップ環境
葃yum install-y atomake atof libtool gcc-c+
二設置に必要なライブラリのRPMをcentosに包みます。
rpm-Uhv http://apt.sw.be/redhat/el5/en/i386/rpmforge/RPMS/rpmforge-release-0.3.6-1.el5.rf.i386.rpm
Install ffmpegなどのモジュールyum-y install ffmpeg-develをインストールします。
*********************************************の下のインストールが完了しました。
php対応プラグインのインストール:FFMPEG-PHP
FFMPEG-PHP cd/usr/local/src wget http://garr.dl.sourceforge.net/sourceforge/ffmpeg-php/ffmpeg-php-0.6.0.tbz2 tar jxvfffmpeg-php-0.6..0.tbz 2 cd ffmpeg-php-0.6/usr/local/php/bin/phpize./configre--with-ph-config/phpfig/phone
php.iniファイルviを修正します。 php.ini
php.iniファイルにこのextension=ffmpeg.soを追加します。
その後、apache/etc/init.d/httpd retartを再起動します。
****備考wgetリンクは失効する可能性があります。おそらく壁に囲まれています。ネットで自分で探すことができます。
----------------------------------------------------
しかし、私はphpinfoを開けてもFFMPEGは見られませんでした。どういうことか分かりません。公式サイトで提供されているインストール方法は、fmpegをサポートするために再コンパイルする必要があります。
私はphpのexec関数を使ってliunxのshell命令を呼べばいいです。つまりFFMPEG-PHPをインストールする必要がないです。
phpのexec関数についての参照:phpではexec、systemなどの関数を使ってシステムコマンドを呼び出します。
サムネイルを取得するための一般的なコマンドです。
例1:352 x 240サイズの一枚を切り取る場合、フォーマットはjpgの画像です。 ffmpeg-i test.asf-y-fイメージ2-t 0.001-s 352 x 240 a.jpg
例2:ビデオの最初の30フレームを一つのAnimed Gifに変換する: ffmpeg-i test.asf-vframe 30-y-f gif a.gif
例3:これは必要です。ビデオの8.01秒目に320*240のサムネイルを切り取ります。
ffmpeg-i test.flv-y-f mjpeg-s s 3-t 0.001-s 320 x 240 test.jpg
例4:
ビデオをflvファイルに変換します。(これが一番多く使われています。今はFlavは基本的にネット動画の標準になりました。)
ffmpeg-i source-s 320×240-b 700 k-aspect 4:3-y-flv dest.fliv。
その中:
source:オリジナルファイルの名前です。mov、mpeg、avi、wmv各フォーマットで、ffmpegはほとんどサポートされています。
-s wxh:ビデオの幅と高さを指定します。
-b:ビデオのビットレートを設定する。
-aspect:ビデオの比率を維持します。4:3または16:9のように
-y:ターゲットファイルが存在する場合は、既存のターゲットファイルを直接上書きします。
-f:変換されたファイルフォーマットを指定します。ここはfliv形式です。ファイル形式を指定しないと、ファイルの拡張子である名来にも変換されます。
dest:変換されたターゲットファイル名は、必ずしもflivではなく、mov、mpegおよびその他の一般的なフォーマットであってもよい。パラメータの説明:
-L license
-hヘルプ
-froomats使用可能なフォーマットを表示し、復号化したもの、プロトコルのもの
-f fmt強制採用フォーマットfmt
-I filename入力ファイル
-y出力ファイルを上書きする
-t duration設定記録時間hh:mm:ss[.xxx]形式の記録時間もサポートします。
-ss positionで指定した時間まで検索します。hh:mm:ss[.xxx]のフォーマットもサポートします。
s wxh:動画の幅と高さを指定します。
******************************************************************
例3:fliv形式のビデオに対して指定された場所のサムネイルを取得します。覚えてください。f強制変換のフォーマットはmjpegです。jpgのサムネイルは、ネット上で多くの書き込みがあります。すべてffmpeg-i test.flv-y-f marg 2-s s 08.10-t 0.001-s 352 x 240 b.jpgというエラーで、出力できません。
上記のスクリーンショットを通して、入力されたflv情報と出力されたjpg画像の情報が見られます。Durationは本明細書で必要なビデオの長さですが、この変数はどうやって取得するか分かりません。
以下はPHPがshellコマンドを呼び出してサムネイルを取得するコードです。
<?php
exec('/usr/bin/ffmpeg-i/usr/local/apphe/httocs/test.flv-y-f mjpeg-s s 3-t 0.001-s 320 x 240/usr/local/apphe/httache/httacs/test.jpg)
printr($status)//0は成功です。1は失敗です。
*********************************************
画像生成の可能性がない場合:
①画像を生成するフォルダには書き込み権限が必要です。
②php.iniにdisable_があります。functionsは、phpがshellコマンド関数を呼び出すことを無効にしました。
ディザブルfunctions=proc_open,popen,exec,system,shell_exec、パステル
解決方法:コメントを削除する。functionsという項目
同前functions=proc_open,popen,exec,system,shell_exec、パステル
或いはdisable_functions=(禁言の関数を除く)
保存を閉じて開けばいいです。
③php.iniのセキュリティモードはオフにしないとexec関数を呼び出すことができません。
safe_mode=off
④画像時間の切り取りも重要であり、無効な画像やブラックスクリーンの可能性が高い。
キーフレームを追加することを提案します。通常、第一フレームはキーフレームであり、使用できます。フレームパラメータは、マイクロ秒パラメータを捨てて、時間パラメータのみを保持します。
//usr/bin/ffmpeg-i/usr/local/apphe/httdocs/test.fliv-y-f mjpeg-ss 3 -vframes 1-s 320 x 240/usr/local/apphe/httdocs/test.jpg
******************************************************************
上はすべてサムネイルを取得する方法です。アンドロイドの開発において、フュージョンを利用して携帯電話の中のビデオのサムネイルを取得する人を見ました。アンドロイドの下の階はliunxであると考えたら、通用するはずです。下はどのようにビデオの長さを獲得して、Durationは必要なビデオの長さですが、どうやって取りに行きますか?
以下は純粋なPHPを使ってビデオを得る時間の長さです。
インターネットで検索してください。phpはflvビデオの長さを獲得します。
いろいろな結果がありますが、十数ページをめくりましたが、tmdは全部コピーして転載しています。しかも全部使えないです。なぜですか?このコードと怪しいです。ネット上のコードを実行してもいいです。これはphpではないと分かります。エディタは文法が明るいと表示されていないので、仕方がないです。私はネットで手書きしました。コードを見たら、間違えました。エラーはまだおかしいです ,興味があったら試してみてもいいです。英語の資料を探すことにしました。最後に外国のウェブサイトでコードを見ました。試してみてもいいです。はははは やっぱり外国人のものがいいですね。
エラーコード:
キーワードがハイライトされていません。
以下は正しいコードです。
私のビデオは55秒がちょうどいいです。OK
ここで簡単に説明します。FFmpegはオーディオとビデオを録画、変換、ストリーミングするための完全な解決策であり、リードするオーディオ/ビデオコーデックのセットです。公式バージョンのffmpegは、rmvbとrmフォーマットには対応していません。しかし、多くの解決方法があります。
FFmpegの公式サイトはhttp://ffmpeg.mplayerhq.hu/です。
中国語Wikiはhttp://www.ffmpeg.com.cn/で、資料が多いです。
一実装FFMEPG
オペレーティングシステム:centos 6
FFMEPGをたくさんインストールした文章を探しましたが、基本的にはコメントがないので、そんなに多くのパッケージをインストールする必要があります。また、上のステップをインストールするといつも問題が発生します。最後にホームページを探して、ちゃんと見ます。確かに公式資料はとても使いやすいです。これからは必ずホームページの資料を優先して見ます。
FFMEPG自体はflv形式をサポートしていますので、つまり今はどのプラグインをインストールする必要はありません。FFMEPGをインストールするには二つの方法があります。
以下はインストール手順です。
セットアップ環境
葃yum install-y atomake atof libtool gcc-c+
二設置に必要なライブラリのRPMをcentosに包みます。
rpm-Uhv http://apt.sw.be/redhat/el5/en/i386/rpmforge/RPMS/rpmforge-release-0.3.6-1.el5.rf.i386.rpm
Install ffmpegなどのモジュールyum-y install ffmpeg-develをインストールします。
*********************************************の下のインストールが完了しました。
php対応プラグインのインストール:FFMPEG-PHP
FFMPEG-PHP cd/usr/local/src wget http://garr.dl.sourceforge.net/sourceforge/ffmpeg-php/ffmpeg-php-0.6.0.tbz2 tar jxvfffmpeg-php-0.6..0.tbz 2 cd ffmpeg-php-0.6/usr/local/php/bin/phpize./configre--with-ph-config/phpfig/phone
php.iniファイルviを修正します。 php.ini
php.iniファイルにこのextension=ffmpeg.soを追加します。
その後、apache/etc/init.d/httpd retartを再起動します。
****備考wgetリンクは失効する可能性があります。おそらく壁に囲まれています。ネットで自分で探すことができます。
----------------------------------------------------
しかし、私はphpinfoを開けてもFFMPEGは見られませんでした。どういうことか分かりません。公式サイトで提供されているインストール方法は、fmpegをサポートするために再コンパイルする必要があります。
私はphpのexec関数を使ってliunxのshell命令を呼べばいいです。つまりFFMPEG-PHPをインストールする必要がないです。
phpのexec関数についての参照:phpではexec、systemなどの関数を使ってシステムコマンドを呼び出します。
サムネイルを取得するための一般的なコマンドです。
例1:352 x 240サイズの一枚を切り取る場合、フォーマットはjpgの画像です。 ffmpeg-i test.asf-y-fイメージ2-t 0.001-s 352 x 240 a.jpg
例2:ビデオの最初の30フレームを一つのAnimed Gifに変換する: ffmpeg-i test.asf-vframe 30-y-f gif a.gif
例3:これは必要です。ビデオの8.01秒目に320*240のサムネイルを切り取ります。
ffmpeg-i test.flv-y-f mjpeg-s s 3-t 0.001-s 320 x 240 test.jpg
例4:
ビデオをflvファイルに変換します。(これが一番多く使われています。今はFlavは基本的にネット動画の標準になりました。)
ffmpeg-i source-s 320×240-b 700 k-aspect 4:3-y-flv dest.fliv。
その中:
source:オリジナルファイルの名前です。mov、mpeg、avi、wmv各フォーマットで、ffmpegはほとんどサポートされています。
-s wxh:ビデオの幅と高さを指定します。
-b:ビデオのビットレートを設定する。
-aspect:ビデオの比率を維持します。4:3または16:9のように
-y:ターゲットファイルが存在する場合は、既存のターゲットファイルを直接上書きします。
-f:変換されたファイルフォーマットを指定します。ここはfliv形式です。ファイル形式を指定しないと、ファイルの拡張子である名来にも変換されます。
dest:変換されたターゲットファイル名は、必ずしもflivではなく、mov、mpegおよびその他の一般的なフォーマットであってもよい。パラメータの説明:
-L license
-hヘルプ
-froomats使用可能なフォーマットを表示し、復号化したもの、プロトコルのもの
-f fmt強制採用フォーマットfmt
-I filename入力ファイル
-y出力ファイルを上書きする
-t duration設定記録時間hh:mm:ss[.xxx]形式の記録時間もサポートします。
-ss positionで指定した時間まで検索します。hh:mm:ss[.xxx]のフォーマットもサポートします。
s wxh:動画の幅と高さを指定します。
******************************************************************
例3:fliv形式のビデオに対して指定された場所のサムネイルを取得します。覚えてください。f強制変換のフォーマットはmjpegです。jpgのサムネイルは、ネット上で多くの書き込みがあります。すべてffmpeg-i test.flv-y-f marg 2-s s 08.10-t 0.001-s 352 x 240 b.jpgというエラーで、出力できません。
上記のスクリーンショットを通して、入力されたflv情報と出力されたjpg画像の情報が見られます。Durationは本明細書で必要なビデオの長さですが、この変数はどうやって取得するか分かりません。
以下はPHPがshellコマンドを呼び出してサムネイルを取得するコードです。
<?php
exec('/usr/bin/ffmpeg-i/usr/local/apphe/httocs/test.flv-y-f mjpeg-s s 3-t 0.001-s 320 x 240/usr/local/apphe/httache/httacs/test.jpg)
printr($status)//0は成功です。1は失敗です。
*********************************************
画像生成の可能性がない場合:
①画像を生成するフォルダには書き込み権限が必要です。
②php.iniにdisable_があります。functionsは、phpがshellコマンド関数を呼び出すことを無効にしました。
ディザブルfunctions=proc_open,popen,exec,system,shell_exec、パステル
解決方法:コメントを削除する。functionsという項目
同前functions=proc_open,popen,exec,system,shell_exec、パステル
或いはdisable_functions=(禁言の関数を除く)
保存を閉じて開けばいいです。
③php.iniのセキュリティモードはオフにしないとexec関数を呼び出すことができません。
safe_mode=off
④画像時間の切り取りも重要であり、無効な画像やブラックスクリーンの可能性が高い。
キーフレームを追加することを提案します。通常、第一フレームはキーフレームであり、使用できます。フレームパラメータは、マイクロ秒パラメータを捨てて、時間パラメータのみを保持します。
//usr/bin/ffmpeg-i/usr/local/apphe/httdocs/test.fliv-y-f mjpeg-ss 3 -vframes 1-s 320 x 240/usr/local/apphe/httdocs/test.jpg
******************************************************************
上はすべてサムネイルを取得する方法です。アンドロイドの開発において、フュージョンを利用して携帯電話の中のビデオのサムネイルを取得する人を見ました。アンドロイドの下の階はliunxであると考えたら、通用するはずです。下はどのようにビデオの長さを獲得して、Durationは必要なビデオの長さですが、どうやって取りに行きますか?
以下は純粋なPHPを使ってビデオを得る時間の長さです。
インターネットで検索してください。phpはflvビデオの長さを獲得します。
いろいろな結果がありますが、十数ページをめくりましたが、tmdは全部コピーして転載しています。しかも全部使えないです。なぜですか?このコードと怪しいです。ネット上のコードを実行してもいいです。これはphpではないと分かります。エディタは文法が明るいと表示されていないので、仕方がないです。私はネットで手書きしました。コードを見たら、間違えました。エラーはまだおかしいです ,興味があったら試してみてもいいです。英語の資料を探すことにしました。最後に外国のウェブサイトでコードを見ました。試してみてもいいです。はははは やっぱり外国人のものがいいですね。
エラーコード:
キーワードがハイライトされていません。
以下は正しいコードです。
<?php
function BigEndian2Int($byte_word, $signed = false) {
$int_value = 0;
$byte_wordlen = strlen($byte_word);
for ($i = 0; $i < $byte_wordlen; $i++) {
$int_value += ord($byte_word{$i}) * pow(256, ($byte_wordlen - 1 - $i));
}
if ($signed) {
$sign_mask_bit = 0x80 << (8 * ($byte_wordlen - 1));
if ($int_value & $sign_mask_bit) {
$int_value = 0 - ($int_value & ($sign_mask_bit - 1));
}
}
return $int_value;
}
//
function getTime($name){
if(!file_exists($name)){
return;
}
$flv_data_length=filesize($name);
$fp = @fopen($name, 'rb');
$flv_header = fread($fp, 5);
fseek($fp, 5, SEEK_SET);
$frame_size_data_length =BigEndian2Int(fread($fp, 4));
$flv_header_frame_length = 9;
if ($frame_size_data_length > $flv_header_frame_length) {
fseek($fp, $frame_size_data_length - $flv_header_frame_length, SEEK_CUR);
}
$duration = 0;
while ((ftell($fp) + 1) < $flv_data_length) {
$this_tag_header = fread($fp, 16);
$data_length = BigEndian2Int(substr($this_tag_header, 5, 3));
$timestamp = BigEndian2Int(substr($this_tag_header, 8, 3));
$next_offset = ftell($fp) - 1 + $data_length;
if ($timestamp > $duration) {
$duration = $timestamp;
}
fseek($fp, $next_offset, SEEK_SET);
}
fclose($fp);
return $duration;
}
// 0:03:56
function fn($time){
$num = $time;
$sec = intval($num/1000);
$h = intval($sec/3600);
$m = intval(($sec%3600)/60);
$s = intval(($sec%60));
$tm = $h.':'.$m.':'.$s;
return $tm;
}
$t = getTime("22.flv");// 236722
echo fn($t);// 0:03:56
?>
プレビューの効果:私のビデオは55秒がちょうどいいです。OK