如何使用 avconv/ffmpeg 获取 H264 文件的 duration/bitrate
How to get the duration/bitrate of a H264 file with avconv/ffmpeg
正在执行 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
我是使用名为 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
持续时间 = nb_read_frames / avg_frame_rate
持续时间为 N/A 的原因是 annexb(原始)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
正在执行 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
我是使用名为 picamera
.
编辑 #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 的原因是 annexb(原始)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