2016-03-16 6 views
2

Как я могу записать временную метку для каждого кадра?ffmpeg timestamp to logfile

Команда:

ffmpeg -i movie.mp4 image%d.jpg -vstats -timestamp now 

Файл журнала:

[email protected]:/home/user# cat vstats_111633.log 
frame=  1 q= 1.8 f_size= 14964 s_size=  15kB time= 0.040 br= 2992.8kbits/s avg_br= 2992.8kbits/s type= I 
frame=  2 q= 1.6 f_size= 150673 s_size=  162kB time= 0.080 br= 30134.6kbits/s avg_br= 16563.7kbits/s type= I 
frame=  3 q= 1.6 f_size= 150794 s_size=  309kB time= 0.120 br= 30158.8kbits/s avg_br= 21095.4kbits/s type= I 
frame=  4 q= 2.1 f_size= 150853 s_size=  456kB time= 0.160 br= 30170.6kbits/s avg_br= 23364.2kbits/s type= I 
frame=  5 q= 4.4 f_size= 95332 s_size=  549kB time= 0.200 br= 19066.4kbits/s avg_br= 22504.6kbits/s type= I 
frame=  6 q= 7.0 f_size= 65227 s_size=  613kB time= 0.240 br= 13045.4kbits/s avg_br= 20928.1kbits/s type= I 
frame=  7 q= 9.8 f_size= 50215 s_size=  662kB time= 0.280 br= 10043.0kbits/s avg_br= 19373.1kbits/s type= I 

Так Идеальным было бы войти Отметка времени Е.Г. 11:33:56

ответ

1

В самом деле, единственный способ проверить временные метки таким образом, следует посмотреть значение столбца time в файле журнала. Эти временные метки представлены в секундах. Таким образом, отметка времени для первого кадра равна 0,040 с, для второго - 0,080 сек и так далее.

Легко видеть, что внешний вид колонки time не настраивается.

Чтобы это подтвердить, давайте посмотрим на функцию do_video_stats из файла ffmpeg.c. Эта функция используется для заполнения содержимого файла журнала. Мы можем увидеть следующую строку здесь:

fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ", (double)ost->data_size/1024, ti1, bitrate, avg_bitrate); 

time= %0.3f отвечает за печать метки времени. Невозможно изменить формат, потому что он жестко закодирован внутри строки формата fprintf.

EDIT

Как уже упоминалось @LordNeckbeard, вы можете использовать ffprobe с -sexagesimal вариант:

ffprobe movie.mp4 -show_packets -sexagesimal 

docs Из:

-show_packets 

    Show information about each packet contained in the input multimedia stream. 

    The information for each single packet is printed within a dedicated section with name "PACKET". 

-sexagesimal 

    Use sexagesimal format HH:MM:SS.MICROSECONDS for time values. 

Так pts_time в каждой [PACKET][/PACKET] секции является метка времени в HH:MM:SS.MICROSECONDS.

+0

Хорошо, так что у меня нет возможности регистрировать время с текущей меткой времени? Или есть какие-то возможные хаки? – user3580316

+0

@ user3580316 У вас уже есть отметки времени в столбце 'time'. Является ли их формат единственной проблемой? –

+1

@ user3580316 вы можете получить похожие результаты, используя 'ffprobe' с опцией' -show_packets'. Но время будет также представлено в секундах ... –