Maison  >  Article  >  développement back-end  >  Comment utiliser Ffmpeg pour obtenir la vignette de la vidéo FLV et la durée de la vidéo

Comment utiliser Ffmpeg pour obtenir la vignette de la vidéo FLV et la durée de la vidéo

醉折花枝作酒筹
醉折花枝作酒筹avant
2021-07-14 15:35:301910parcourir

FFmpeg est une solution complète pour l'enregistrement, la conversion et le streaming audio et vidéo, une bibliothèque de codecs audio/vidéo leader. La version officielle de ffmpeg ne prend pas en charge les formats rmvb et rm. Aujourd'hui, nous allons le présenter.

Comment utiliser Ffmpeg pour obtenir la vignette de la vidéo FLV et la durée de la vidéo

Après une longue recherche sur Google, j'ai découvert que je pouvais utiliser Ffmpeg pour obtenir des informations sur les vidéos. Laissez-moi d'abord vous présenter FFMEPG

Voici une brève introduction : FFmpeg est une solution complète pour l'enregistrement et la conversion. et streaming audio et vidéo, un ensemble La principale bibliothèque de codecs audio/vidéo. La version officielle de ffmpeg ne prend pas en charge les formats rmvb et rm. Cependant, il existe de nombreuses solutions. Le site officiel de FFmpeg est http://ffmpeg.mplayerhq.hu/.

Le wiki chinois est http://www.ffmpeg.com.cn/, qui contient de nombreuses informations.

㈠Installation de FFMEPG

Système d'exploitation : centos6

J'ai trouvé tellement d'articles sur l'installation de FFMEPG, mais en gros il n'y a aucun commentaire, donc de nombreux logiciels doivent être installés et il n'y a aucune explication sur leur utilisation. Je suis confus. . De plus, il y a toujours des problèmes avec les étapes d'installation ci-dessus. Au final, je dois chercher le site officiel et y regarder attentivement. Il est vrai que les informations officielles sont très utiles, je dois donner la priorité au site officiel. informations dans le futur.

Étant donné que FFMEPG lui-même prend en charge le format flv, ce qui signifie qu'il n'est pas nécessaire d'installer de plug-ins pour le moment, seul FFMEPG doit être installé. Il existe deux façons d'installer FFMEPG : ① Installation du package de code source, je ne le fais pas. Je ne sais pas pourquoi cela signale toujours une erreur ② Installation de la commande Yum, centos Ce miam est la meilleure commande, haha

Voici les étapes d'installation :

㈠Installer l'environnement de compilation

#yum install -y automake autoconf libtool gcc gcc-c++

㈡Installez le package RPM de la bibliothèque requise sur centos

rpm -Uhv http://apt.sw.be/redhat/el5/en/i386/rpmforge/RPMS/rpmforge-release-0.3.6-1.el5 .rf.i386.rpm

Installez ffmpeg et d'autres modules

yum -y installez ffmpeg ffmpeg-devel


************************** ****************スntススL'installation suivante Déjà effectuée !

Installez le plug-in de support php : FFMPEG-PHP

Installez 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

Puis modifiez le fichier php.ini

vi php.ini


Ajoutez cette phrase au fichier php.ini

extension=ffmpeg.so


Puis redémarrer Apache

/etc/init.d/httpd restart


*********** Notez que le lien wget est peut-être invalide. Il est probablement bloqué en ligne

-----. ------ -------------------------------------------- ------ ---------------------------------------------

Mais je open phpinfo n'a pas vu FFMPEG. Je ne sais pas ce qui s'est passé. La méthode d'installation fournie sur le site officiel nécessite de recompiler PHP pour prendre en charge ffmpeg, étant donné que les services fonctionnent tous sur centos, puisque centos est déjà disponible. ,

alors je peux simplement utiliser la fonction exec de php pour appeler la commande shell de liunx, ce qui signifie qu'il n'est pas nécessaire d'installer FFMPEG-PHP

Pour plus d'informations sur la fonction exec de php, veuillez vous référer à : Utilisation d'exec, du système et d'autres fonctions en php pour appeler les commandes système

Vous trouverez ci-dessous une commande courante pour obtenir des vignettes :

Exemple 1 :

Découpez une image de taille 352x240 au format jpg :

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

Exemple 2 :

Convertir les 30 premières images de la vidéo en Gif animé :

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

Exemple 3 : C'est ce dont j'ai besoin !

Capturez une vignette 320*240 à la 8,01 seconde de la vidéo


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

Exemple 4 :

Convertir la vidéo en un fichier flv (c'est le plus couramment utilisé, et maintenant Flv est devenu le standard pour les vidéos en ligne)

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

Parmi eux :

    source : est le nom du fichier original, qui peut être aux formats mov, mpeg, avi, wmv, ffmpeg les supporte essentiellement.
  • -s wxh : Spécifiez la largeur et la hauteur de la vidéo
  • -b : Définissez le débit binaire de la vidéo
  • -aspect : Maintenez le ratio de la vidéo. Tel que 4:3 ou 16:9
  • -y : si le fichier cible existe, écrasez directement le fichier cible d'origine.
  • -f : Spécifiez le format de fichier converti, voici le format flv. (En fait, si le format de fichier n'est pas spécifié, ffmpeg convertira également en fonction du nom de suffixe du fichier).
  • dest : Le nom du fichier cible converti ne doit pas nécessairement être flv, il peut s'agir de mov, mpeg et d'autres formats courants.
  • Description du paramètre :

-L licence

-h aide

-fromats Afficher les formats, codecs, protocoles disponibles

-f fmt Forcer le format fmt

-I fichier d'entrée du nom de fichier

-y écrase le fichier de sortie

-t durée définit la durée d'enregistrement hh:mm:ss[.xxx] la durée d'enregistrement au format est également prise en charge

-ss recherche la position pour l'heure spécifiée [-]hh:mm:ss[.xxx] Le format est également pris en charge

s lxh : Spécifiez la largeur et la hauteur de la vidéo

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

Exemple 3 : Obtenez la vignette à l'emplacement spécifié pour la vidéo au format flv. N'oubliez pas que le format de conversion forcée -f est mjpeg car je souhaite obtenir la vignette .jpg. Il existe de nombreux articles écrits sur Internet qui le sont. écrit comme ffmpeg -i test. flv -y -f image2 -ss 08.010 -t 0.001 -s 352x240 b.jpg C'est une erreur et il est impossible de sortir

Comment utiliser Ffmpeg pour obtenir la vignette de la vidéo FLV et la durée de la vidéo

Grâce à la capture d'écran ci-dessus : nous pouvons voir le. informations flv d'entrée et informations sur l'image jpg de sortie, la durée est la longueur de la vidéo nécessaire pour cet article, mais je ne sais pas comment obtenir cette variable

Ce qui suit est le code pour appeler la commande shell en PHP pour obtenir le vignette

<?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是失败

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

Si aucune image n'est générée, les raisons possibles sont :

①Pour stocker les images générées Le dossier doit avoir une autorisation en écriture #chomd 777 /usr/local/apache/htdocs

②Il y a Disable_functions dans php.ini pour désactiver PHP appelant la fonction de commande Shell,

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

Solution : commentez l'élément Disable_functions

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

or Disable_functions = (supprimer la fonction interdite)

Enregistrer, fermer et activer

③Le mode sans échec dans php.ini doit être désactivé avant d'appeler la fonction exec

safe_mode = off

④L'interception du temps d'image est également très importante, il s'agit probablement d'une image invalide ou d'un écran noir

Il est recommandé d'ajouter des images clés, généralement les premières images sont des images clés, vous pouvez utiliser : vframes : paramètres d'image, ignorer les paramètres de microseconde , ne conservez que les paramètres temporels

/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

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

Ce sont toutes des solutions pour obtenir des vignettes. J'ai vu quelqu'un utiliser ffmpeg pour obtenir des vignettes. de vidéos sur les téléphones mobiles pendant le développement d'Android étant donné que la couche inférieure d'Android est Linux, elle devrait être universelle ! Voici comment obtenir la durée de la vidéo. Bien que la durée soit la durée de la vidéo requise, je ne sais pas comment l'obtenir, pouvez-vous m'apprendre, s'il vous plaît !

Voici la durée d'une vidéo obtenue en PHP pur :

Vous pouvez effectuer une recherche sur Internet : Comment obtenir la longueur d'une vidéo flv avec php

Vous pouvez trouver de nombreux résultats, mais j'ai feuilleté plus de dix pages et J'ai découvert que les tmd sont tous copiés et réimprimés et qu'ils ne peuvent pas tous être utilisés, je ne sais pas pourquoi ? Ce code est bizarre. Vous pouvez exécuter le code sur Internet. Vous constaterez que ce n'est pas PHP, car l'éditeur n'affiche pas la coloration syntaxique. J'ai copié le code en ligne et j'ai trouvé que l'erreur est toujours bizarre. . . . Le message d'erreur est très étrange. Si vous êtes intéressé, vous pouvez l'essayer. Je n'ai pas décidé de rechercher des informations en anglais. Finalement, j'ai vu le code sur un site Web étranger, je peux l'essayer ! Hahaha, les trucs des étrangers fonctionnent si bien

Code incorrect :

Comment utiliser Ffmpeg pour obtenir la vignette de la vidéo FLV et la durée de la vidéo

Les mots clés ne sont pas mis en évidence

Ce qui suit est le code correct :

<?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 
		?>

Effet d'aperçu :

Comment utiliser Ffmpeg pour obtenir la vignette de la vidéo FLV et la durée de la vidéo

Ma vidéo est55 Juste quelques secondes ! ok

Apprentissage recommandé : Tutoriel vidéo php

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer