如何使用avconv/ffmpeg获取H264文件的持续时间/比特率

如何使用avconv/ffmpeg获取H264文件的持续时间/比特率,ffmpeg,h.264,avconv,ffprobe,avprobe,Ffmpeg,H.264,Avconv,Ffprobe,Avprobe,执行avprobe test.h264输出 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 test.h264: JVT NAL sequence, H.264 video @ L 30 执行文件test.h264输出 Input #0, h264, from

执行
avprobe test.h264
输出

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
test.h264: JVT NAL sequence, H.264 video @ L 30
执行
文件test.h264
输出

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
test.h264: JVT NAL sequence, H.264 video @ L 30
请注意,文件没有损坏或损坏,我可以在VLC上毫无问题地播放它

有没有办法从原始H264文件中获取持续时间和比特率?我在某个地方读到,如果我先对文件进行解码,这是可能的,但我不确定如何做到这一点

编辑#1

我是用名为
picamera
的Python库创建H264文件的人

编辑#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

您可以将其多路复用到一个容器中,然后进行检查

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

Duration=
nb\u read\u frames/avg\u frame\u rate

Duration为N/A的原因是附录B(原始)H.264文件通常没有存储在文件中的时间戳或帧速率信息。帧速率可以选择性地存储在PPS的VUI中,但此文件显然没有,因此它只知道帧数(通过解析整个文件),而不知道与时间戳相关的任何内容。

一种方法是使用
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

因此,我目前无法获得视频文件的持续时间,但有没有办法?正如@Mulvya所建议的,最简单的解决方案是将视频帧多路复用成容器格式,例如mp4、mkv或类似的格式。这些容器格式包含时间戳和持续时间信息。对于已经创建的文件,您可以手动重新添加这些信息,方法是将它们(使用ffmpeg)重新放入另一个容器中,并通知ffmpeg源的帧速率(ffmpeg-r 30-i file.h264-c:v copy file.mp4,我相信)。我得到
time=1000000000.00
。我的视频有6秒长,所以我怀疑这些信息是否有意义。@MaximePre为我工作过。显示实际命令和完整的控制台输出。你真的在使用
ffmpeg
?我使用的是
avconv
ffmpeg
的分支,它做的事情几乎相同)。我更新了问题的完整控制台输出。@MaximedPre我的回答是专门针对
ffmpeg
,我认为这是可以接受的,因为问题标题中有“ffmpeg”,并且使用了ffmpeg标记。请尝试
ffmpeg
。您可以简单地执行该命令。将文件“Muxing”到容器似乎可以工作,但在运行该命令时,它会在输出流0:0中输出
非单调DTS;上一次:203,当前:0;改为204。这可能会导致输出文件中的时间戳不正确。
对于试图为MP4文件编码的每一帧。它是否可靠?谢谢原始比特流中没有时间戳,因此它将
0
输入到每个传入帧,这当然是错误的。但这不是问题。如果您的比特流没有像上面提到的@Ronald那样存储帧速率,那么您应该在
'-i
之前添加
-framerate N
,其中N是fps值,否则ffmpeg将假定为25 fps。
avconv-framerate 30-i test.h264-c copy test.mp4
工作正常!谢谢