Как извлечь время из состава ffmpeg выход?
чтобы получить много информации о медиа-файле можно сделать
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//g'
но он печатает все, а не только длину.
даже ffmpeg -i file.mp4 | grep Duration выводит все.
как я могу получить только продолжительность длины?
12 ответов:
ffmpeg записывает эту информацию в
stderr, а неstdout. Попробуйте это:ffmpeg -i file.mp4 2>&1 | grep Duration | sed 's/Duration: \(.*\), start//g'обратите внимание на перенаправление
stderrдоstdout:2>&1EDIT:
код
sedутверждение не работает. Попробуйте это:ffmpeg -i file.mp4 2>&1 | grep Duration | awk '{print }' | tr -d ,
можно использовать
ffprobe:ffprobe -i <file> -show_entries format=duration -v quiet -of csv="p=0"Он будет выводиться время в секундах, таких как:
154.12добавлять
-sexagesimalопция будет выводить продолжительность как часы:минуты:секунды.микросекунды:00:02:34.12
как следствие, я бы использовал правильный инструмент для работы - в этом случае 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": escape значение
"-show_entries формат=продолжительность": сделать записи в поле длительность в раздел именем формата
ссылки: ffprobe man pages
в случае одного параметра запроса проще использовать mediainfo и его форматирование вывода следующим образом (для длительности; ответ в миллисекундах)
amber ~ > mediainfo --Output="General;%Duration%" ~/work/files/testfiles/+h263_aac.avi 24840
Я рекомендую использовать формат 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 } }вы можете найти информацию о продолжительности в разделе формат, работает как для видео, так и для аудио
для тех, кто хочет выполнять те же вычисления без дополнительного программного обеспечения в 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
Лучшее Решение: вырезать экспорт сделать что-то вроде 00:05:03.22
ffmpeg -i input 2>&1 | grep Duration | cut -c 13-23
Я бы просто сделал это в C++ с текстовым файлом и извлек токены. Зачем? Я не эксперт по терминалам linux, как и другие.
Чтобы настроить его, я бы сделал это в Linux..
ffmpeg -i 2>&1 | grep "" > mytext.txtа затем запустите какое-нибудь приложение на C++, чтобы получить необходимые данные. Может извлекать все важные значения и переформатировать его для дальнейшей обработки с помощью маркеров. Мне просто придется работать над своим собственным решением, и люди будут просто смеяться надо мной, потому что я новичок в linux, и мне это не нравится слишком много сценариев.
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 }' | ./a.out
обратите внимание на a. out. Это мой код C, чтобы отрезать полученную запятую, потому что выход-это что-то вроде 00:00:01.33,
Вот это код C, который принимает stdin и выводит правильную информацию, необходимую. Я должен был взять больше и меньше знаков для просмотра.
#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
вы можете попробовать это:
/* * 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 был заменен avconv: просто замените avconb на ответ Луи Марасио.
avconv -i file.mp4 2>&1 | grep Duration | sed 's/Duration: \(.*\), start.*//g'Примечание: aditional .* после начала, чтобы получить время в одиночку !!
Comments