Video 如何正确制作视频循环?
我想循环播放这个视频。我希望以这样的方式播放mp4文件,每当它到达视频中的某个点(比如说,30.3秒),它都会返回(例如,5.85秒) 我尝试在ffplay.c中添加此代码,但效果不够好,我可以听到转换。我猜搜索不够快,或者音频需要以独立的方式循环Video 如何正确制作视频循环?,video,ffmpeg,Video,Ffmpeg,我想循环播放这个视频。我希望以这样的方式播放mp4文件,每当它到达视频中的某个点(比如说,30.3秒),它都会返回(例如,5.85秒) 我尝试在ffplay.c中添加此代码,但效果不够好,我可以听到转换。我猜搜索不够快,或者音频需要以独立的方式循环 static void video_refresh(void *opaque, double *remaining_time) { (original code here...) time = get_master_clock(is);
static void video_refresh(void *opaque, double *remaining_time)
{
(original code here...)
time = get_master_clock(is);
if (isnan(time))
time = (double)is->seek_pos / AV_TIME_BASE;
if (time > jump_when) {
stream_seek(is, (int64_t)(6.0 * AV_TIME_BASE), (int64_t)(0.0 * AV_TIME_BASE), 0);
}
}
我目前的计划是深入研究ffmpeg,了解视频和音频解码器的工作原理,并保存解码器的状态/加载状态
- “我希望以这样的方式播放mp4文件,即每当它到达视频中的某个点(例如:30.3秒),它都会返回到较早的时间(例如:5.85秒)。”
- “我能听到转换的声音。我想搜索不够快,或者音频需要以独立的方式循环。”
在MPEG压缩中,只能搜索关键帧。每个音频帧都是一个关键帧,但视频有3种类型的帧:
I
(这是一个关键帧或完整图片),还有P
和B
帧(随着时间的推移,它们与主图片只有很小的差异)。这些P/B帧需要一个最近的前一个关键帧先解码,,因此它们也有像素数据要显示。P/B帧本身无法解码(因为它们不是完整的图像数据)。是的,上面的代码已经在寻找关键帧。我告诉stream\u seek
搜索到6秒,但它会搜索到5.1秒。因此,我不是选择“从哪里”跳转,而是选择“从哪里”跳转,即jump\u when
变量。似乎我无法获得正确的跳转时间,音频总是0.02秒慢或快,无法正确对齐。跳转发生在video_refresh函数中,该函数每秒调用30次,这种精度似乎还不够。