Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Video 如何正确制作视频循环?_Video_Ffmpeg - Fatal编程技术网

Video 如何正确制作视频循环?

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);

我想循环播放这个视频。我希望以这样的方式播放mp4文件,每当它到达视频中的某个点(比如说,30.3秒),它都会返回(例如,5.85秒)

我尝试在ffplay.c中添加此代码,但效果不够好,我可以听到转换。我猜搜索不够快,或者音频需要以独立的方式循环

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秒)。”

  • “我能听到转换的声音。我想搜索不够快,或者音频需要以独立的方式循环。”

链接视频每2秒有一个关键帧(精确到2.023)。 因此,您只能搜索2.023、4.023、6.023、8.023等秒数

如果您想要5.850秒,您需要首先以4秒的速度搜索关键帧,然后对下一帧进行解码,直到所需的时间戳为5.850。此时,您可以显示视频

我过去使用的解决方案是,在将p/B帧的字节送入H264解码器之前,简单地将其时间戳(PTS)调整为与关键帧相同。(通过这种方式,解码器被迫在视频中快进以保持同步)。我只在命令行中使用了FFmpeg,所以不确定如何在显示的代码中更改显示时间

为什么?

在MPEG压缩中,只能搜索关键帧。每个音频帧都是一个关键帧,但视频有3种类型的帧:
I
(这是一个关键帧或完整图片),还有
P
B
帧(随着时间的推移,它们与主图片只有很小的差异)。这些P/B帧需要一个最近的前一个关键帧先解码,因此它们也有像素数据要显示。P/B帧本身无法解码(因为它们不是完整的图像数据)。

是的,上面的代码已经在寻找关键帧。我告诉
stream\u seek
搜索到6秒,但它会搜索到5.1秒。因此,我不是选择“从哪里”跳转,而是选择“从哪里”跳转,即
jump\u when
变量。似乎我无法获得正确的跳转时间,音频总是0.02秒慢或快,无法正确对齐。跳转发生在video_refresh函数中,该函数每秒调用30次,这种精度似乎还不够。