Как извлечь продолжительность времени от FFmpeg выход?

Обновить

November 2018

Просмотры

65.3k раз

54

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

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выводит все.

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

12 ответы

100

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

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

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

154.12

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

00:02:34.12
43

FFmpeg пишет эту информацию stderr, а не stdout. Попробуй это:

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

Обратите внимание на переназначение stderrв stdout:2>&1

РЕДАКТИРОВАТЬ:

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

ffmpeg -i file.mp4 2>&1 | grep Duration | awk '{print $2}' | tr -d ,
1

Я рекомендую использовать формат 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
    }
}

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

-1

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

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

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

-3

Вы можете попробовать это:

/*
* 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;
0

Лучшее решение: сократить экспорт действительно получить что - то вроде 00: 05: 03,22

ffmpeg -i input 2>&1 | grep Duration | cut -c 13-23
-5

FFmpeg был заменен avconv: просто заменить avconb ответить Луи Marascio в.

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

Примечание: * после того, как услуги для покупателей начать, чтобы получить время в покое !!.

-1

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

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

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

Я не отправляя решение, потому что я не хороший человек прямо сейчас

Обновление - У меня есть свой подход, чтобы получить, что время продолжительности штемпель

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

Шаг 2 - Дом в по необходимости информацию и извлечь его
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

11

Из моего опыта многих инструментов предлагают нужные данные в каком-то таблицах / упорядоченную структуру, а также предлагают параметры для сбора отдельных частей этих данных. Это относится, например, к smartctl, SMI-NVIDIA и 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 тихий»: Не выводить ничего, кроме желаемого исходного значения данных

«-Print_format»: Используйте определенный формат, чтобы распечатать данные

«Компактный =»: Используйте компактный формат вывода

«Print_section = 0»: Не выводить название раздела

«: NOKEY = 1»: не печатать ключ ключа: пары значений

«: Побег = CSV»: побег значения

«-Show_entries формат = длительность»: Получить данные о поле с именем длительность в формате раздела по имени

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

5

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

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

Для тех, кто хочет выполнить те же расчеты без дополнительного программного обеспечения в Windows, вот скрипт для командной строки сценария:

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

Тот же ответ размещены здесь: Как обрезать последние N секунд от видео TS

1
ffmpeg -i abc.mp4 2>&1 | grep Duration | cut -d ' ' -f 4 | sed s/,//

дает выход

HH: MM: SS.milisecs