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



执行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

执行file test.h264输出

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

注意,文件没有损坏或损坏,我可以在VLC上播放它没有问题。

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

编辑# 1

我是用Python库picamera创建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

时长= nb_read_frames / avg_frame_rate

持续时间为N/A的原因是附件(原始)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

最新更新