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?

54
demandé sur Tarantula 2011-06-05 00:55:02

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 ,
42
répondu Louis Marascio 2011-06-04 21:02:13

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
96
répondu Ivan Neeson 2016-02-28 19:18:27

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

11
répondu Saucier 2014-07-02 11:28:18

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
5
répondu gemelen 2018-06-17 19:01:16
ffmpeg -i abc.mp4 2>&1 | grep Duration | cut -d ' ' -f 4 | sed s/,//

donne la sortie

HH: MM: SS.milisecs

1
répondu sparsh turkane 2016-12-02 14:36:14

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

1
répondu vivisidea 2018-05-25 05:45:55

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

0
répondu digitalfootmark 2017-05-23 12:26:36

meilleure Solution: couper l'exportation obtenir quelque chose comme 00:05:03.22

ffmpeg -i input 2>&1 | grep Duration | cut -c 13-23
0
répondu Mike 2018-07-04 13:55:45

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.

-1
répondu AdmiralSmith 2016-11-03 02:03:52

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

-1
répondu AdmiralSmith 2016-11-04 02:48:47

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;
-3
répondu ManawatuHonky 2012-11-04 08:08:16

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

-5
répondu muralisc 2014-09-17 04:07:24