ホームページ >バックエンド開発 >PHPの問題 >Ffmpegを使用してflvビデオのサムネイルとビデオの長さを取得する方法

Ffmpegを使用してflvビデオのサムネイルとビデオの長さを取得する方法

醉折花枝作酒筹
醉折花枝作酒筹転載
2021-07-14 15:35:302003ブラウズ

FFmpeg は、オーディオとビデオの記録、変換、ストリーミングのための完全なソリューションであり、主要なオーディオ/ビデオ コーデック ライブラリです。 ffmpeg の正式バージョンは、rmvb および rm 形式をサポートしていません。今日はそれを紹介します。

Ffmpegを使用してflvビデオのサムネイルとビデオの長さを取得する方法

# 長い間 Google を検索した結果、Ffmpeg を使用してビデオに関する情報を取得できることがわかりました。まず FFMEPG


# を紹介します。 ##簡単な説明は次のとおりです: FFmpeg は、オーディオとビデオの記録、変換、ストリーミングのための完全なソリューション、主要なオーディオ/ビデオ コーデック ライブラリに使用されます。 ffmpeg の公式バージョンは rmvb および rm 形式をサポートしていませんが、多くの解決策があります

FFmpeg の公式 Web サイトは http://ffmpeg.mplayerhq.hu/ です。

中国語の Wiki は http://www.ffmpeg.com.cn/ で、多くの情報が含まれています。

㈠FFMEPG のインストール

オペレーティング システム: centos6

FFMEPG のインストールに関する記事はたくさん見つかりましたが、基本的にコメントがないため、多くのソフトウェア パッケージをインストールする必要があります。それが何に使用されるのかの説明がなく、混乱しています。 。また、上記のインストール手順では常に問題が発生し、最終的には公式 Web サイトを探して注意深く確認する必要があります。確かに公式情報は非常に有益です。公式 Web サイトを優先する必要があります。今後の情報。

FFMEPG 自体が flv 形式をサポートしているため、現時点ではプラグインをインストールする必要はなく、FFMEPG のみをインストールする必要があります FFMEPG をインストールするには、次の 2 つの方法があります: ① ソース コード パッケージインストール、なぜいつもエラーが報告されるのかわかりません。 ② yum コマンドのインストール、centos yum が最高のコマンドです、笑

以下はインストール手順です:

㈠コンパイル環境をインストールします

#yum install -y automake autoconf libtool gcc 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

ffmpeg とその他のモジュールをインストールします

yum -y install ffmpeg ffmpeg -devel


***** ****************************centos 以下のインストールが完了しました。

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 jxvf ffmpeg-php-0.6.0.tbz2
cd ffmpeg-php-0.6.0
/usr/local/ php/ bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-confi
make
make install

次にphpを変更します。 .ini ファイル

vi php.ini


この文を php.ini ファイル

extension=ffmpeg.so


に追加し、Apache

/etc/init を再起動します。 .d/ httpd restart


*******注: wget リンクは無効である可能性があります。おそらくブロックされています。オンラインで見つけることができます

------ ---------------------------------------------------- ----------------------------------------------------

しかし、phpinfoを開いてもFFMPEGが表示されず、何が起こったのかわかりません。公式サイトに記載されているインストール方法では、ffmpegをサポートするためにPHPを再コンパイルする必要があり、面倒です。すべてのサービスがcentos上で実行されていることを考慮すると、 centos ではすでにそれができるので、

これで、php の exec 関数を使用して liunx のシェル コマンドを呼び出すことができるようになり、FFMPEG-PHP

For をインストールする必要がなくなります。 php の exec 関数については、次を参照してください。 php exec、system、およびその他の関数を使用してシステム コマンドを呼び出す

次は、サムネイルを取得するための一般的なコマンドです:

例 1:

352x240 サイズの画像を jpg 形式でキャプチャします:

ffmpeg -i test.asf -y -f image2 -t 0.001 -s 352x240 a.jpg

例 2:

最初の 30 フレームを変換しますビデオをアニメーション Gif に変換します。

ffmpeg -i test.asf -vframes 30 -y -f gif a.gif

例 3: これが必要なものです。

ビデオの 8.01 秒で 320*240 のサムネイルを取得します


ffmpeg -i test.flv -y -f mjpeg -ss 3 -t 0.001 -s 320x240 test.jpg

例 4:

ビデオを flv ファイルに変換します (これが最もよく使用されており、現在では Flv が基本的にオンライン ビデオの標準になっています)

ffmpeg -i source -s 320× 240 -b 700k -aspect 4:3 -y -f flv dest.flv。

そのうち:

    source: は元のファイルの名前で、mov、mpeg、avi、wmv 形式を使用できます。ffmpeg は基本的にそれらをサポートします。
  • #-s wxh: ビデオの幅と高さを指定します
  • #-b: ビデオのビットレートを設定

  • -aspect: ビデオのアスペクト比を維持します。例: 4:3 または 16:9

  • -y: ターゲット ファイルが存在する場合、元のターゲット ファイルを直接上書きします。

  • -f: 変換後のファイル形式を指定します。ここでは flv 形式です。 (実際、ファイル形式が指定されていない場合、ffmpeg はファイル拡張子名に従って変換も行います)。

  • dest: 変換後のターゲット ファイル名は必ずしも flv である必要はなく、mov、mpeg、その他の一般的な形式でも構いません。

  • パラメータの説明:

  • -L ライセンス

-h Help

-fromats 利用可能な形式、コーデック、プロトコルを表示します

-f fmt は fmt 形式を強制します

-I ファイル名入力ファイル

-y 出力ファイルを上書きします

-t 期間は録音時間を設定します hh 録音:mm:ss[.xxx] 形式の時刻は

-ss 位置にも対応 時刻指定検索の形式 [-]hh:mm:ss[.xxx] も

# に対応## s wxh: ビデオの幅と高さを指定します

##******************************* ********* **************************************** **

例 3: flv 形式のビデオの指定された場所のサムネイルを取得します。.jpg のサムネイルを取得したいので、-f 強制変換の形式は mjpeg であることに注意してください。インターネット上に多くの記事が書かれています。 as ffmpeg -i test.flv -y -f image2 -ss 08.010 -t 0.001 -s 352x240 b.jpg これはエラーのため出力できません。

Ffmpegを使用してflvビデオのサムネイルとビデオの長さを取得する方法

上のスクリーンショットを通して、入力 flv 情報と出力 jpg 画像情報を確認できます。Duration はこの記事に必要なビデオの長さですが、この変数を取得する方法がわかりません。

次のとおりです。 PHP でシェル コマンドを呼び出してサムネイルを取得するためのコード

<?php
exec("/usr/bin/ffmpeg -i /usr/local/apache/htdocs/test.flv -y -f mjpeg -ss 3 -t 0.001 -s 320x240 /usr/local/apache/htdocs/test.jpg",$out,$status);   
print_r($status);//0是成功 1是失败

******************************* ********************* **

画像が生成されない場合、考えられる理由:

①生成された画像が保存されているフォルダー保存されているには書き込み権限が必要です#chomd 777 /usr/local/apache/htdocs

②php.ini には、php によるシェル コマンド関数の呼び出しを無効にする disable_functions があります。

disable_functions = proc_open 、popen,exec、system、shell_exec、passthru

解決策: disable_functions をコメントアウトします。この項目

#disable_functions = proc_open、popen、exec、system、shell_exec、passthru

またはdisable_functions = (禁止された関数を削除します)

保存して閉じて有効にするだけです

③exec 関数を呼び出す前に php.ini のセーフ モードをオフにする必要があります

safe_mode = off

④ピクチャ時間のインターセプトも非常に重要で、無効になる可能性がありますピクチャまたは黒い画面

キー フレームを追加することをお勧めします。通常、最初のフレームがキー フレームです。次を使用できます。 vframes: フレーム パラメータ。マイクロ秒パラメータを破棄し、時間パラメータのみを保持します。

/usr/bin /ffmpeg -i /usr/local/apache/htdocs/test.flv -y -f mjpeg -ss 3 -vframes 1 -s 320x240 /usr/local/apache/htdocs/test.jpg

** ********************* ************************************************** ****

上記はすべてサムネイルを取得するための解決策です。Android 開発で ffmpeg を使用している人を見かけました。携帯電話でビデオのサムネイルを取得します。Android の最下層が liunx であることを考慮すると、それは普遍的であるべきです!動画の長さを取得する方法です。Duration が必要な動画の長さなのですが、取得方法がわかりません。取得方法を知っている方がいらっしゃいましたら、ご教授ください。

以下は純粋な PHP を使用して取得されたビデオの長さです:

インターネットで検索できます: php で flv ビデオの長さを取得できます

多くの結果が見つかります。と思ったのですが、めくってみたら10ページ以上、tmdがコピーされて再現されていて、全部使えませんでした。このコードは奇妙です。インターネット上でコードを実行できます。エディタでは構文の強調表示が表示されないため、これが PHP ではないことがわかります。方法はありません。コードをオンラインでコピーしましたが、エラーは依然として奇妙であることがわかりました。 。 。報告されたエラーは非常に奇妙です。興味のある方は試してみてください。英語の情報を探すことに決めたわけがありません。最終的には、海外の Web サイトでコードを見つけました。試してみることができます。ははは、やはり外国人の作品でとてもうまく機能します。

間違ったコード:

Ffmpegを使用してflvビデオのサムネイルとビデオの長さを取得する方法

キーワードが強調表示されていません

次は正しいコードです:

<?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, &#39;rb&#39;);
	$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.&#39;:&#39;.$m.&#39;:&#39;.$s;
		return $tm;
	
	}

		 $t = getTime("22.flv");//显示数字时间如236722 
		echo fn($t);//显示时间格式0:03:56 
		?>

プレビュー効果:

Ffmpegを使用してflvビデオのサムネイルとビデオの長さを取得する方法

私のビデオはちょうど 55 秒です。 ok

推奨学習: php ビデオ チュートリアル

以上がFfmpegを使用してflvビデオのサムネイルとビデオの長さを取得する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。