90 votes

Comment extraire la durée à partir de la sortie de ffmpeg ?

Pour obtenir beaucoup d'informations sur un fichier multimédia, on peut faire ce qui suit

ffmpeg -i <filename>

où il sortira un grand nombre de lignes, dont une en particulier

Duration: 00:08:07.98, start: 0.000000, bitrate: 2080 kb/s

Je voudrais que la sortie soit uniquement 00:08:07.98 alors j'essaie

ffmpeg -i file.mp4 | grep Duration| sed 's/Duration: \(.*\), start/\1/g'

Mais il imprime tout, et pas seulement la longueur.

Même ffmpeg -i file.mp4 | grep Duration sort tout.

Comment obtenir la durée exacte ?

1 votes

IMHO MediaInfo vous offrirait certainement une sortie beaucoup plus facile à analyser.

206voto

Ivan Neeson Points 346

Vous pouvez utiliser ffprobe :

ffprobe -i <file> -show_entries format=duration -v quiet -of csv="p=0"

Il donnera la durée en secondes, comme par exemple :

154.12

Ajout de la -sexagesimal l'option produira la durée comme heures:minutes:secondes.microsecondes :

00:02:34.12

1 votes

Pour mon ffmpeg-0.6.5-1.el6.rf.x86_64, le format est : ffprobe <file> -show_format 2>&1 | sed -n 's/duration=//p'

3 votes

C'est la voie à suivre. ffmpeg -i a toujours voulu transcoder un nouveau fichier après avoir imprimé les données. Une solution bien plus propre ici.

0 votes

Devrait être la réponse acceptée, bien que le format de sortie (secondes) ne soit pas exactement ce qui a été demandé.

63voto

Louis Marascio Points 1449

Ffmpeg écrit cette information à stderr pas stdout . Essayez ceci :

ffmpeg -i file.mp4 2>&1 | grep Duration | sed 's/Duration: \(.*\), start/\1/g'

Remarquez 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 $2}' | tr -d ,

3 votes

Grep n'est pas nécessaire, sed -n 's/Duration: \(.*\), start/\1/gp' est suffisant.

11 votes

En fait, sed n'est pas nécessaire : ffmpeg -i file.mp4 2>&1 | grep -o -P "(?<=Duration: ).*?(?=,)"

1 votes

Quel est le contexte pour cela si je veux stocker la durée comme une variable à utiliser dans le même script PHP ?

16voto

Saucier Points 1238

D'après mon expérience, de nombreux outils proposent les données souhaitées sous la forme d'un tableau ou d'une structure ordonnée, ainsi que des paramètres permettant de rassembler des parties spécifiques de ces données. Cela s'applique par exemple à smartctl, nvidia-smi et ffmpeg/ffprobe. En clair, il n'est souvent pas nécessaire de faire circuler les données ou d'ouvrir des sous-shells pour une telle tâche.

Par conséquent, j'utiliserais le bon outil pour le travail - dans ce cas, ffprobe renverrait la valeur brute de la durée en secondes, après quoi on pourrait créer le format de temps souhaité par soi-même :

$ 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 rien sortir d'autre que la valeur des données brutes désirées

"-print_format" : Utiliser un certain format pour imprimer les données

"compact=" : Utiliser un format de sortie compact

"print_section=0" : Ne pas imprimer le nom de la section

":nokey=1" : ne pas imprimer la clé de la paire clé:valeur

":escape=csv" : échapper la valeur

"-show_entries format=duration" : Obtenir les entrées d'un champ nommé "duration" dans une section nommée "format".

Référence : Pages de manuel de ffprobe

0 votes

Excellent. Réponse lisible par une machine !

8voto

gemelen Points 86

Dans le cas d'un seul 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)

mediainfo --Output="General;%Duration%" ~/work/files/testfiles/+h263_aac.avi 

sorties

24840

2 votes

Cela devrait être 'mediainfo --Inform="General;%Duration%" ~/work/files/testfiles/+h263_aac.avi'.

0 votes

Les deux formulaires fonctionnent de manière identique dans mediainfo v18.05 (et semble-t-il avec les versions précédentes).

8voto

vivisidea Points 81

Je recommande d'utiliser le format json, il est plus facile à analyser.

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 les informations sur la durée dans la section format, cela fonctionne aussi bien pour la vidéo que pour l'audio.

0 votes

Merci ! C'est exactement ce dont j'avais besoin !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X