使用GStreamer timecodestamper添加时间码时触发断言失败
解决GStreamer timecodestamper元素的断言失败问题
问题重现
使用timecodestamper元素为GStreamer管道添加时间码时,触发以下断言错误:
gst_video_time_code_add_frames: assertion 'gst_video_time_code_is_valid (tc)' failed gst_video_time_code_nsec_since_daily_jam: assertion 'gst_video_time_code_is_valid (tc)' failed
涉及的管道配置:
appsrc name=src emit-signals=True format=time ! video/x-raw,format=BGR,width=1920,height=1080,framerate=1/10 ! timecodestamper ! videoconvert ! x264enc pass=quant quantizer=0 tune=zerolatency ! h264parse ! mp4mux ! filesink location=output.mp4
原本预期无需额外配置时,timecodestamper会自动为每帧生成递增时间码,但实际触发报错。
问题原因
timecodestamper元素默认不会自动初始化有效的时间码上下文。尽管文档描述默认使用递增计数器,但必须显式提供初始时间码参数,或确保元素能基于输入流元数据生成有效时间码,否则内部时间码对象处于无效状态,触发断言检查失败。
解决方案
1. 显式配置初始时间码参数
为timecodestamper指定起始时间码和匹配输入流的帧率,确保时间码上下文有效:
修改后的管道示例:
appsrc name=src emit-signals=True format=time ! video/x-raw,format=BGR,width=1920,height=1080,framerate=1/10 ! timecodestamper start-timecode="00:00:00:00" framerate=1/10 ! videoconvert ! x264enc pass=quant quantizer=0 tune=zerolatency ! h264parse ! mp4mux ! filesink location=output.mp4
start-timecode:设置起始时间码,格式为HH:MM:SS:FFframerate:必须与输入视频流的framerate完全一致(此处为1/10)
2. 确保appsrc传递有效时间戳
由于appsrc设置了format=time,需保证推送的每个缓冲区都带有正确的时间戳。timecodestamper依赖缓冲区时间戳计算递增时间码,缺失或无效的时间戳会导致时间码初始化失败。
额外验证
可通过以下命令查看timecodestamper的所有可配置参数,按需调整:
gst-inspect-1.0 timecodestamper
内容的提问来源于stack exchange,提问作者rgov
相关产品推荐
相关产品推荐

