我想知道是否可以在创建片段时更改ffmpeg中视频片段的元数据。我知道通过使用“-metadata”标签,您可以更改-i输入视频的元数据,但如果通过“-f segment”选项将-i输入视频拆分为不同的段,那么您如何在分割-i输入视频时更改结果段的元数据?我知道在分段完成后可以更改元数据,但这并不是很有用,因为我希望在输入视频被分段时实时流式传输段。为了更好地描述一下:
ffmpeg -f video4linux2 -s wvga -t ${CAPTURE_DURATION} -i "/dev/video0" -r 30 \
-vcodec ${VID_CODEC} -s:v 640x480 -b:v 80k -keyint_min 30 -g 30 \
-sc_threshold 0 -map 0 -flags -global_header -qcomp 0.8 \
-qmin 10 -qmax 51 -qdiff 4 -f segment -segment_time ${SEG_TIME} \
-segment_format ${SEG_FORMAT} -metadata START=0 -y "${LOCATE}${OUTPUT}%01d.${EXTENSION}"
基本上我正在做的是从标准视频输入中获取视频并对其进行分割。创建视频片段后,我可以通过将视频片段全部放入VLC播放列表来测试视频,当片段格式为“mp4”时,每个视频片段之间存在明显的延迟,其中VLC将不会启动视频片段直到它已播放该片段在原始视频中的时间。因此,例如,如果我有30秒的视频,并将其分成5秒的片段,VLC将立即播放第1段,但在第1段完成播放后播放第2段之前将等待5秒。这样做是因为第2段的开始时间元数据为5秒,因此VLC认为它必须等待5秒才能播放第2段。我想知道的是,如果有一种方法可以告诉ffmpeg在创建段时将段开始时间元数据设置为0秒。任何帮助将不胜感激。
答案 0 :(得分:1)
根据源代码,有一个标志可以做你想要的:
{ "reset_timestamps", "reset timestamps at the begin of each segment",
OFFSET(reset_timestamps), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 1, E }
而不是-metadata START=0
使用-reset_timestamps 1
,您的所有细分将立即开始播放。