ffmpeg 未在录制文件中添加正确的时间戳并生成 76 毫秒的文件

ffmpeg 未在录制文件中添加正确的时间戳并生成 76 毫秒的文件

我正在使用 ffmpeg 通过 rtsp 协议录制摄像头流。摄像头流通过 rtsp-simple-server 使用。我通过将 output_ts_offset 设置为 epoch realtime 来创建 10 秒的文件。

ffmpeg 命令:

ffmpeg -hide_banner -loglevel warning -rtsp_transport tcp -i rtsp://rtsp_simple_server_ip:rtsp_simple_server_port/stream_url -muxpreload 0 -muxdelay 0 -c:v copy -an -f segment -strftime 1 -segment_time 10 -output_ts_offset $EPOCHREALTIME -segment_atclocktime 1 -segment_clocktime_offset 30 -segment_format mp4 file_%s.mp4

每个文件都以偏移量 - start_time 作为纪元时间戳(ffmpeg 管道启动时的当前时间戳,在创建 10 秒文件时继续添加 10 秒)保存,并在文件名中添加相同的时间戳。例如 file_1669903600.mp4。 FPS 为 15。

ffprobe 输出:

start_time=1669903599.93233
duration=10.106771
[/STREAM]
[FORMAT]
filename=file_1669903600.mp4
[/FORMAT]

[STREAM]
start_time=1669903605.53452
duration=10.106771
[/STREAM]
[FORMAT]
filename=file_1669903610.mp4
[/FORMAT]

在第二个示例中,start_time 和 filename 相差 5 秒,这是不正确的。同样,有时时间戳的差异可达 50000 秒。

文件使用过去或未来的 start_time 元数据保存。有人在使用 ffmpeg 时遇到过同样的问题吗?

突然,我得到了持续时间为 76ms 的文件,帧率从 15 增加到 1986,然后这个时间戳差异(开始时间 - 文件名时间戳)开始以负 10 增加,一直到 -47270(过去)或有时会增加到将来。

[STREAM]
r_frame_rate=25/1
avg_frame_rate=778240/51953  <-- framerate = 15
time_base=1/15360
start_pts=25872908239503
start_time=1684434130.175977
duration=10.147070
nb_frames=152
[/STREAM]
[FORMAT]
filename=file_1684434130.mp4
[/FORMAT]
[STREAM]
r_frame_rate=25/1
avg_frame_rate=2334720/155849  <-- framerate = 15
time_base=1/15360
start_pts=25872908394947
start_time=1684434140.296029
duration=10.146419
nb_frames=152
[/STREAM]
[FORMAT]
filename=file_1684434140.mp4
[/FORMAT]
[STREAM]
r_frame_rate=25/1
avg_frame_rate=389120/16871  <-- framerate = 23
time_base=1/15360
start_pts=25872908551004
start_time=1684434150.455990
duration=6.590234
nb_frames=152
[/STREAM]
[FORMAT]
filename=file_1684434150.mp4
[/FORMAT]
[STREAM]
r_frame_rate=15360/1
avg_frame_rate=466944/235  <-- framerate = 1986
time_base=1/15360
start_pts=25872908651213
start_time=1684434156.980013 <-- behind 4 seconds than filename timestamp
duration=0.076497
nb_frames=152
[/STREAM]
[FORMAT]
filename=file_1684434160.mp4
[/FORMAT]
[STREAM]
r_frame_rate=15360/1
avg_frame_rate=466944/235  <-- framerate = 1986
time_base=1/15360
start_pts=25872908651366
start_time=1684434156.989974  <-- behind 14 seconds than filename timestamp
duration=0.076497
nb_frames=152
[/STREAM]
[FORMAT]
filename=file_1684434170.mp4
[/FORMAT]
...
...
...
[STREAM]
r_frame_rate=15360/1
avg_frame_rate=466944/235 <-- framerate = 1986
time_base=1/15360
start_pts=25872908681733
start_time=1684434158.966992 <-- behind 2042 seconds than filename
duration=0.076497
nb_frames=152
[/STREAM]
[FORMAT]
filename=file_1684436200.mp4
[/FORMAT]


为什么帧速率突然跳到 1986 并且为什么 ffmpeg 从每个文件中的时间戳元数据中减少 10 秒?

预期输出:时间戳应该匹配(start_time 时间戳应该等于文件名时间戳)

相关内容