我正在尝试使用rstp流和它们检索相机每帧的时间戳。为了记录,我使用以下命令行,它的工作:
ffmpeg
-correct_ts_overflow 0
-probesize 1G
-analyzeduration 1G
-i rtsp://user:password@ip:port
-vcodec copy
-bsf:v h264_mp4toannexb
-bufsize 10M
-acodec copy
-f ssegment
-segment_list_flags live
-segment_atclocktime 1
-reset_timestamps 1
-write_empty_segments 1
-segment_time 15
-segment_list C:VideoDeliveryffmpeglist.video
-segment_list_type csv
-strftime 1 "C:VideoDeliveryffmpeg%%Y%%m%%d_%%H-%%M-%%S.ts"
对于一些实用程序,我希望能够检索机器的时间戳,当我收到一个帧,所以通过搜索一点,我发现不同的帖子'-mkvtimestamp_v2'。用相机单独试一下,就像下面这样:
ffmpeg
-copyts ^
-correct_ts_overflow 0 ^
-probesize 1G ^
-analyzeduration 1G ^
-i rtsp://user:password@ip:port
-c copy
-pix_fmt yuv420p
-flush_packets 1
-vframes 10
-reset_timestamps 1
-timestamp now
-copyts
-f mkvtimestamp_v2 timestamp.txt
-vsync 0
效果很好。
但是从我尝试记录和尝试检索时间戳同时使用以下命令的那一刻起:
ffmpeg
-use_wallclock_as_timestamps 1
-correct_ts_overflow 0
-probesize 1G
-analyzeduration 1G
-i rtsp://user:password@ip:port
-vcodec copy
-bsf:v h264_mp4toannexb
-bufsize 10M
-acodec copy
-f ssegment
-segment_list_flags live
-segment_atclocktime 1
-reset_timestamps 1
-write_empty_segments 1
-segment_time 15
-segment_list C:VideoDeliveryffmpeglist.video
-segment_list_type csv
-strftime 1 "C:VideoDeliveryffmpeg%%Y%%m%%d_%%H-%%M-%%S.ts"
-copyts
-vcodec copy
-flush_packets 1
-f mkvtimestamp_v2 log.txt
-vsync 0
我得到了很多:Non-monotonous DTS in output stream 0:0
警告。在记录的时间戳和实际时间戳之间也有平均一分钟的延迟。第一个录制的视频在视频播放器上有一个有bug的计时器,像这样:这里
我试着把命令按不同的顺序排列,但我没有得到任何结论…
所以如果你有任何想法,这将是一个很大的帮助!
我在Windows 10上工作,我使用ffmpeg-3.4.1。
诚恳
周杰伦
我通过管道将第二个输出输出到另一个ffmpeg实例来解决这个问题。我认为这有效的原因是因为第二个ffmpeg将丢弃由-use_wallclock_as_timestamps 1
添加的时间戳偏移量,并将偏移量重置为0。
ffmpeg -use_wallclock_as_timestamps 1 -i rtsp://@ip:port -c copy -copyts -y -f mkvtimestamp_v2 timestamps.txt -vsync 0 -c copy -f mpegts - | ffmpeg -f mpegts -i - -c copy -f segment output-segment-%d.mp4
然而,这个解决方案的另一个问题是,如果RTSP丢弃一些帧,那么mkvtimestamp_v2
文件将跳过一些时间值,使得很难将片段与timestamp .txt文件相关联。
因此,我通过将挂钟时间戳嵌入到片段本身来解决这个问题。
ffmpeg -use_wallclock_as_timestamps 1 -i rtsp://@ip:port -c copy -copyts -vsync passthrough -f segment -segment_time 10 out%d.mp4
然后我可以稍后在每个段上运行ffprobe以了解它们的实际开始时间。(相对于系统时钟)。