Как извлечь длительность времени из вывода ffmpeg? - PullRequest
59 голосов
/ 05 июня 2011

Чтобы получить много информации о медиафайле, можно сделать

ffmpeg -i <filename>

, где будет выведено много строк, в частности одна

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

Я хотел бы вывести только 00:08:07.98, поэтому я пытаюсь

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

Но он печатает все, а не только длину.

Даже ffmpeg -i file.mp4 | grep Duration выводит все.

Как я могу получить только продолжительность?

Ответы [ 13 ]

113 голосов
/ 07 марта 2014

Вы можете использовать ffprobe:

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

. Она выдаст длительность в секундах, например:

154.12

При добавлении опции -sexagesimal длительность будет отображаться как часы: минуты: секунды. Микросекунды :

00:02:34.12
50 голосов
/ 05 июня 2011

ffmpeg записывает эту информацию в stderr, а не stdout. Попробуйте это:

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

Обратите внимание на перенаправление от stderr до stdout: 2>&1

EDIT:

Ваше заявление sed тоже не работает. Попробуйте это:

ffmpeg -i file.mp4 2>&1 | grep Duration | awk '{print $2}' | tr -d ,
11 голосов
/ 30 июня 2014

По моему опыту, многие инструменты предлагают желаемые данные в виде некой таблицы / упорядоченной структуры, а также предлагают параметры для сбора определенных частей этих данных. Это относится, например, к smartctl, nvidia-smi и ffmpeg / ffprobe тоже. Проще говоря - часто нет необходимости передавать данные или открывать субоболочки для такой задачи.

Как следствие, я бы использовал правильный инструмент для работы - в этом случае ffprobe вернет необработанное значение длительности в секундах, после чего можно будет создать желаемый формат времени самостоятельно:

$ ffmpeg --version
ffmpeg version 2.2.3 ...

Команда может отличаться в зависимости от используемой версии.

#!/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"

Объяснение:

"- v quiet": не выводить ничего, кроме нужного значения необработанных данных

"- print_format": использовать определенный формат для распечатки данных

"compact =": использовать компактный формат вывода

"print_section = 0": не печатать название раздела

": nokey = 1": не печатать ключ ключ: пара значений

": escape = csv": экранировать значение

"- show_entries format = duration": получить записи поля с длительностью внутри раздела с именем format

Ссылка: Справочные страницы ffprobe

5 голосов
/ 29 января 2013

В случае использования одного параметра запроса проще использовать mediainfo и форматирование его вывода следующим образом (для длительности; ответ в миллисекундах)

amber ~ > mediainfo --Output="General;%Duration%" ~/work/files/testfiles/+h263_aac.avi 
24840
2 голосов
/ 25 мая 2018

Рекомендую использовать формат json, парсинг проще

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

Вы можете найти информацию о продолжительности в разделе формата, работает как для видео, так и для аудио

2 голосов
/ 28 ноября 2016
ffmpeg -i abc.mp4 2>&1 | grep Duration | cut -d ' ' -f 4 | sed s/,//

дает вывод

HH: MM: SS.milisecs

1 голос
/ 04 июля 2018

Лучшее решение: Вырежьте экспорт, получите что-то вроде 00: 05: 03.22

ffmpeg -i input 2>&1 | grep Duration | cut -c 13-23
0 голосов
/ 13 марта 2019

Если вы хотите получить длину (и, возможно, все другие метаданные) из вашего медиа-файла с помощью ffmpeg , используя скрипт Python , вы можете попробовать это:

import subprocess
import json

input_file  = "< path to your input file here >"

metadata = subprocess.check_output(f"ffprobe -i {input_file} -v quiet -print_format json -show_format -hide_banner".split(" "))

metadata = json.loads(metadata)
print(f"Length of file is: {float(length["format"]["duration"])}")
print(metadata)

Выход:

Length of file is: 7579.977143

{
  "streams": [
    {
      "index": 0,
      "codec_name": "mp3",
      "codec_long_name": "MP3 (MPEG audio layer 3)",
      "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/14112000",
      "start_pts": 353600,
      "start_time": "0.025057",
      "duration_ts": 106968637440,
      "duration": "7579.977143",
      "bit_rate": "320000",
      ...
      ...
0 голосов
/ 04 ноября 2016

Argh. Забудь про это. Похоже, я должен вытащить паутину из моих программ на C и C ++ и использовать ее вместо этого. Я не знаю всех трюков с оболочкой, чтобы заставить его работать. Это как далеко я получил.

ffmpeg -i myfile 2>&1 | grep "" > textdump.txt

и тогда я, вероятно, извлеку бы продолжительность с помощью приложения на C ++ вместо извлечения токенов.

Я не публикую решение, потому что я не очень хороший человек

Обновление - у меня есть подход к получению этой метки времени

Шаг 1 - Получить информацию о мультимедиа в текстовом файле
`ffprobe -i myfile 2>&1 | grep "" > textdump.txt`
OR
`ffprobe -i myfile 2>&1 | awk '{ print }' > textdump.txt`

Шаг 2 - Найдите необходимую информацию и извлеките ее
<code>cat textdump.txt | grep "Duration" | awk '{ print $2 }' | ./a.out
Обратите внимание на a.out. Это мой код на C, чтобы отрубить результирующую запятую, потому что вывод примерно такой: 00: 00: 01.33,
Вот код C, который принимает стандартный ввод и выводит нужную информацию. Я должен был взять больше и меньше, чем вывески для просмотра.

#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); }

Теперь формат вывода корректно, например, 00: 00: 01.33

0 голосов
/ 03 ноября 2016

Я бы просто сделал это в C ++ с текстовым файлом и извлек бы токены.Зачем?Я не эксперт терминала Linux, как другие.
Чтобы настроить его, я бы сделал это в Linux ..

ffmpeg -i 2>&1 | grep "" > mytext.txt

, а затем запустил приложение C ++, чтобы получить необходимые данные.Может быть, извлечь все важные значения и переформатировать его для дальнейшей обработки с помощью токенов.Мне просто нужно будет поработать над своим собственным решением, и люди будут просто смеяться надо мной, потому что я новичок в Linux и не слишком люблю сценарии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...