Comment extraire la durée de la sortie ffmpeg?
pour obtenir beaucoup d'informations sur un fichier média on peut faire
ffmpeg -i <filename>
où il produira beaucoup de lignes ,une en particulier
Duration: 00:08:07.98, start: 0.000000, bitrate: 2080 kb/s
je voudrais sortir seulement 00:08:07.98
, donc j'essaie
ffmpeg -i file.mp4 | grep Duration| sed 's/Duration: (.*), start//g'
mais il imprime tout, et pas seulement la longueur.
Even ffmpeg -i file.mp4 | grep Duration
affiche tout.
Comment obtenir juste la durée?
12 réponses
ffmpeg écrit cette information à stderr
, et non à stdout
. Essayez ceci:
ffmpeg -i file.mp4 2>&1 | grep Duration | sed 's/Duration: \(.*\), start//g'
Avis de la redirection de stderr
à stdout
: 2>&1
EDIT:
votre sed
ne fonctionne pas non plus. Essayez ceci:
ffmpeg -i file.mp4 2>&1 | grep Duration | awk '{print }' | tr -d ,
vous pouvez utiliser ffprobe
:
ffprobe -i <file> -show_entries format=duration -v quiet -of csv="p=0"
il affichera la durée en secondes, comme:
154.12
ajouter l'option -sexagesimal
affichera la durée comme heures:minutes:secondes.microsecondes :
00:02:34.12
de mon expérience de nombreux outils offrent les données désirées dans une sorte de tableau/structure commandée et offrent également des paramètres pour recueillir des parties spécifiques de ces données. Cela s'applique également à smartctl, nvidia-smi et ffmpeg/ffprobe. Pour parler simplement - souvent, il n'est pas nécessaire de canaliser des données ou d'ouvrir des sous-puits pour une telle tâche.
par conséquent, j'utiliserais l'outil adéquat pour la tâche - dans ce cas, ffprobe retournerait la valeur de la durée brute en secondes, ensuite, on pourrait créer le format de temps désiré sur son propre:
$ ffmpeg --version
ffmpeg version 2.2.3 ...
La commande peut varier en fonction de la version que vous utilisez.
#!/usr/bin/env bash
input_file="/path/to/media/file"
# Get raw duration value
ffprobe -v quiet -print_format compact=print_section=0:nokey=1:escape=csv -show_entries format=duration "$input_file"
une explication:
"- V quiet": ne pas produire autre chose que la valeur de données brutes désirée
"- print_format": utiliser un certain format pour imprimer les données
" compact=": utiliser une sortie compacte format
"print_section=0": Ne pas imprimer le nom de la section
":nokey=1": n'imprime pas la clé de la clé:valeur
":escape=csv": échapper à la valeur
"-show_entries format=" durée: Obtenir des entrées d'un champ nommé durée à l'intérieur d'une section nommée "format 151930920"
la Référence: ffprobe pages man
dans le cas d'un paramètre de requête, il est plus simple d'utiliser mediainfo et son formatage de sortie comme ceci (pour la durée; réponse en millisecondes)
amber ~ > mediainfo --Output="General;%Duration%" ~/work/files/testfiles/+h263_aac.avi
24840
ffmpeg -i abc.mp4 2>&1 | grep Duration | cut -d ' ' -f 4 | sed s/,//
donne la sortie
HH: MM: SS.milisecs
je recommande d'utiliser le format json, c'est plus facile pour l'analyse
ffprobe -i your-input-file.mp4 -v quiet -print_format json -show_format -show_streams -hide_banner
{
"streams": [
{
"index": 0,
"codec_name": "aac",
"codec_long_name": "AAC (Advanced Audio Coding)",
"profile": "HE-AACv2",
"codec_type": "audio",
"codec_time_base": "1/44100",
"codec_tag_string": "[0][0][0][0]",
"codec_tag": "0x0000",
"sample_fmt": "fltp",
"sample_rate": "44100",
"channels": 2,
"channel_layout": "stereo",
"bits_per_sample": 0,
"r_frame_rate": "0/0",
"avg_frame_rate": "0/0",
"time_base": "1/28224000",
"duration_ts": 305349201,
"duration": "10.818778",
"bit_rate": "27734",
"disposition": {
"default": 0,
"dub": 0,
"original": 0,
"comment": 0,
"lyrics": 0,
"karaoke": 0,
"forced": 0,
"hearing_impaired": 0,
"visual_impaired": 0,
"clean_effects": 0,
"attached_pic": 0
}
}
],
"format": {
"filename": "your-input-file.mp4",
"nb_streams": 1,
"nb_programs": 0,
"format_name": "aac",
"format_long_name": "raw ADTS AAC (Advanced Audio Coding)",
"duration": "10.818778",
"size": "37506",
"bit_rate": "27734",
"probe_score": 51
}
}
vous pouvez trouver l'information sur la durée dans la section format, fonctionne à la fois pour vidéo et audio
pour ceux qui veulent effectuer les mêmes calculs sans logiciel supplémentaire dans Windows, voici le script pour le script en ligne de commande:
set input=video.ts
ffmpeg -i "%input%" 2> output.tmp
rem search " Duration: HH:MM:SS.mm, start: NNNN.NNNN, bitrate: xxxx kb/s"
for /F "tokens=1,2,3,4,5,6 delims=:., " %%i in (output.tmp) do (
if "%%i"=="Duration" call :calcLength %%j %%k %%l %%m
)
goto :EOF
:calcLength
set /A s=%3
set /A s=s+%2*60
set /A s=s+%1*60*60
set /A VIDEO_LENGTH_S = s
set /A VIDEO_LENGTH_MS = s*1000 + %4
echo Video duration %1:%2:%3.%4 = %VIDEO_LENGTH_MS%ms = %VIDEO_LENGTH_S%s
même réponse posté ici: comment récolter les dernières N secondes D'une vidéo TS
meilleure Solution: couper l'exportation obtenir quelque chose comme 00:05:03.22
ffmpeg -i input 2>&1 | grep Duration | cut -c 13-23
je le ferais simplement en C++ avec un fichier texte et extraire les tokens. Pourquoi? Je ne suis pas un expert en terminaux linux comme les autres.
Pour l'installer, je le ferais sous Linux..
ffmpeg -i 2>&1 | grep "" > mytext.txt
et ensuite lancer une application C++ pour obtenir les données nécessaires. Peut-être extraire toutes les valeurs importantes et le reformater pour un traitement ultérieur en utilisant des jetons. Je vais juste devoir travailler sur ma propre solution et les gens vont juste se moquer de moi parce que je suis un débutant de linux et que je n'aime pas trop les scripts.
Argh. L'oublier. Il semble que je doive sortir les toiles d'araignées de ma programmation C et C++ et l'utiliser à la place. Je ne connais pas tous les shell astuces pour le faire fonctionner.
C'est dans quelle mesure j'ai eu.
ffmpeg -i myfile 2>&1 | grep "" > textdump.txt
et puis je voudrais probablement extraire la durée avec une application C++ à la place en extrayant des jetons.
Je ne Poste pas la solution parce que je ne suis pas une bonne personne en ce moment
mise à Jour - j'ai mon approche pour obtenir que le temps de la durée du timbre
Étape 1-Obtenez l'information sur le média dans un fichier texte
`ffprobe -i myfile 2>&1 | grep "" > textdump.txt`
ou
`ffprobe -i myfile 2>&1 | awk '{ print }' > textdump.txt`
Étape 2-accueil de l'information nécessaire et l'extraire
cat textdump.txt | grep "Duration" | awk '{ print }' | ./a.out
remarquez le A. dehors. C'est mon code C pour couper la virgule résultante parce que la sortie est quelque chose comme 00:00:01.33,
Voici le code C qui prend stdin et affiche les informations correctes nécessaires. J'ai dû prendre le plus et le moins de signes pour la visualisation.
#include stdio.h
#include string.h
void main()
{
//by Admiral Smith Nov 3. 2016
char time[80];
int len;
char *correct;
scanf("%s", &time);
correct = (char *)malloc(strlen(time));
if (!correct)
{
printf("\nmemory error");
return;
}
memcpy(correct,&time,strlen(time)-1);
correct[strlen(time)]='/0';
printf("%s", correct);
free(correct);
}
maintenant les formats de sortie correctement comme 00: 00:01.33
vous pourriez essayer ceci:
/*
* Determine video duration with ffmpeg
* ffmpeg should be installed on your server.
*/
function mbmGetFLVDuration($file){
//$time = 00:00:00.000 format
$time = exec("ffmpeg -i ".$file." 2>&1 | grep 'Duration' | cut -d ' ' -f 4 | sed s/,//");
$duration = explode(":",$time);
$duration_in_seconds = $duration[0]*3600 + $duration[1]*60+ round($duration[2]);
return $duration_in_seconds;
}
$duration = mbmGetFLVDuration('/home/username/webdir/video/file.mov');
echo $duration;
ffmpeg a été remplacé par avconv: il suffit de substituer avconb à la réponse de Louis Marascio.
avconv -i file.mp4 2>&1 | grep Duration | sed 's/Duration: \(.*\), start.*//g'
Note: le supplément .* après commencer à obtenir le temps seul !!