2016-06-30 7 views
2

avprobe test.h264 Выполнение выходовКак получить длительность/битрейт в H264 файл с avconv/FFmpeg

Input #0, h264, from 'test.h264': 
    Duration: N/A, bitrate: N/A 
    Stream #0.0: Video: h264 (High), yuv420p, 720x480, 25 fps, 25 tbn, 50 tbc 

Выполнение file test.h264 выходов

test.h264: JVT NAL sequence, H.264 video @ L 30 

Обратите внимание, что файл не поврежден или поврежден, я может играть без проблем в VLC.

Есть ли способ получить продолжительность и битрейт из необработанного файла H264? Я где-то читал, что это возможно, если я сначала декодирую файл, но я не уверен, как это можно сделать.

Редактировать # 1

Я один создания файла H264 с библиотекой Python под названием picamera.

Edit # 2

Консоль вывода при работе avconv -i test.h264 -f null -

avconv version 11.7-6:11.7-1~deb8u1+rpi1, Copyright (c) 2000-2016 the Libav developers 
    built on Jun 17 2016 02:13:49 with gcc 4.9.2 (Raspbian 4.9.2-10) 
[h264 @ 0x1bcc200] Estimating duration from bitrate, this may be inaccurate 
Input #0, h264, from 'test.h264': 
    Duration: N/A, bitrate: N/A 
    Stream #0.0: Video: h264 (High), yuv420p, 720x480, 25 fps, 25 tbn 
Output #0, null, to 'pipe:': 
    Metadata: 
    encoder   : Lavf56.1.0 
    Stream #0.0: Video: rawvideo, yuv420p, 720x480, q=2-31, 200 kb/s, 25 tbn, 25 tbc 
    Metadata: 
     encoder   : Lavc56.1.0 rawvideo 
Stream mapping: 
    Stream #0:0 -> #0:0 (h264 (native) -> rawvideo (native)) 
Press ctrl-c to stop encoding 
frame= 208 fps= 68 q=0.0 Lsize=  0kB time=10000000000.00 bitrate= 0.0kbits/s 
video:13kB audio:0kB other streams:0kB global headers:0kB muxing overhead: unknown 

ответ

4

Вы можете мультиплексировать его в контейнер, а затем проверить

ffmpeg -i test.h264 -c copy test.mp4 

ffprobe test.mp4 

Вы также можете рассчитывать кадры в H264 и делить на частоту кадров

ffprobe test.h264 -count_frames -show_entries stream=nb_read_frames,avg_frame_rate,r_frame_rate 

Продолжительность = nb_read_frames/avg_frame_rate

+0

«мультиплексирование» файл в контейнер, кажется, работает, но при выполнении команды он выводит данные 'Non-однообразные DTS в выходном потоке 0: 0; previous: 203, текущий: 0; изменение на 204. Это может привести к неправильной отметке времени в выходном файле. 'для каждого кадра, который он пытается кодировать для файла MP4. Также он надежный? Благодаря! – maximedupre

+1

Нет временных меток в исходном битовом потоке, поэтому он вменяет «0» в каждый входящий кадр, что, конечно, неверно. Но не проблема. Если ваш бит-поток не имеет частоты кадров, хранящейся, как упоминал @Ronald, тогда вы должны добавить '-framerate N' перед' '-i', где N - значение fps. Else ffmpeg будет принимать 25 кадров в секунду. – Mulvya

+0

'avconv -framerate 30 -i test.h264 -c copy test.mp4' отлично работает! Благодаря! – maximedupre

2

Продолжительность причина заключается в N/A, что annexb файлы (сырье) H.264, обычно не имеют метку времени или частоты кадров информации, хранящейся в файле. Фреймер можно по желанию сохранить в VUI PPS, но у этого файла, по-видимому, нет этого, поэтому все, что он знает, это framecount (путем разбора всего файла), но не связанное с меткой времени.

+0

Так что я в настоящее время не могу получить продолжительность видеофайла, но есть ли способ, которым я могу? – maximedupre

+0

, как предлагал @Mulvya, наиболее простым решением является мультиплексирование видеокадров в формат контейнера, например. mp4, mkv или что-то в этом роде. Эти форматы контейнеров содержат информацию о времени и длительности.С уже созданными вами файлами вы можете вручную повторно добавить эту информацию, переустановив их (используя ffmpeg) в другой контейнер и сообщив ffmpeg о частоте кадров источника (ffmpeg -r 30 -i file.h264 -c: v copy file.mp4 , Я верю). –

1

Один способ расшифровать файл с ffmpeg, чтобы получить продолжительность:

ffmpeg -framerate 24 -i input.h264 -f null - 

Затем сослаться на time= во втором к последней строке в консоли вывода для продолжительности. Например, 5 второй вход:

frame= 125 fps=0.0 q=-0.0 Lsize=N/A time=00:00:05.00 bitrate=N/A speed= 189x 
+0

Я получаю 'time = 10000000000.00'. Мое видео длится 6 секунд, поэтому я сомневаюсь, что эта информация имеет смысл. – maximedupre

+0

@maximedupre Работал для меня. Покажите свою фактическую команду и полный вывод консоли. Вы действительно используете 'ffmpeg'? – LordNeckbeard

+0

Я использую 'avconv' (fork' ffmpeg', который делает почти то же самое). Я обновил свой вопрос на полной версии консоли. – maximedupre