Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.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

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
Algorithm 从n0初始帧开始,每N帧采样一次视频 问题:_Algorithm_Video_Ffmpeg_Sampling - Fatal编程技术网

Algorithm 从n0初始帧开始,每N帧采样一次视频 问题:

Algorithm 从n0初始帧开始,每N帧采样一次视频 问题:,algorithm,video,ffmpeg,sampling,Algorithm,Video,Ffmpeg,Sampling,我试图弄清楚如何在每一帧中对视频流进行采样,从帧开始,从帧开始,这样我就可以得到长度为len(x)/n的新视频 在公式中,这很简单:y\u i[n]=x[n\u i+n*n] 下面是我试图实现的目标的示意图: 贪婪的解决方案是简单地将帧转储到文件夹中,然后用适当索引的帧创建新的视频。 我希望有一些更优雅的解决方案与ffmpeg,因为我必须处理数百个视频 实施 最后,我成功地编写了最终的实现,为了完整起见,我在这里报告它。 它将最小尺寸缩放到256,处理的帧数不超过max_;每k帧执行一次采样,

我试图弄清楚如何在每一帧中对视频流进行采样,从帧开始,从帧开始,这样我就可以得到长度为
len(x)/n的新视频

在公式中,这很简单:
y\u i[n]=x[n\u i+n*n]

下面是我试图实现的目标的示意图:

贪婪的解决方案是简单地将帧转储到文件夹中,然后用适当索引的帧创建新的视频。 我希望有一些更优雅的解决方案与
ffmpeg
,因为我必须处理数百个视频

实施 最后,我成功地编写了最终的实现,为了完整起见,我在这里报告它。
它将最小尺寸缩放到
256
,处理的帧数不超过
max_
;每
k
帧执行一次采样,将第一个
k-1
样本发送到一个文件夹,将第k个
k
样本发送到另一个文件夹。它还将输出帧速率设置为输入平均帧速率,因为否则一些视频将以120 Hz的频率播放

k=5
kk=$(awk "BEGIN{print 1/$k}")
ffmpeg \
    -i $src_video_path \
    -an \
    -loglevel error \
    -filter_complex \
        "setpts=$kk*PTS, \
        scale=w=2*trunc(128*max(1\, iw/ih)):h=2*trunc(128*max(1\, ih/iw))[m]; \
        [m]select=n=$k:e=(mod(n\,$k)+1)*lt(n\,$max_frames) \
        $(for ((i=1; i<=$k; i++)); do
            echo -n "[a$i]"
        done)" \
    $(for ((i=1; i<$k; i++)); do
        echo -n "-r $fps -map [a$i] $dst_video_path/$i.mp4 "
    done
    echo -n "-r $fps -map [a$k] $val_video_path/$k.mp4"
    )
k=5
kk=$(awk“开始{print 1/$k}”)
ffmpeg\
-i$src\u视频\u路径\
-一个\
-日志级错误\
-过滤复合物\
“设定值=$kk*PTS\
比例=w=2*trunc(128*max(1\,iw/ih)):h=2*trunc(128*max(1\,ih/iw))[m]\
[m] 选择=n=$k:e=(mod(n\,$k)+1)*lt(n\,$max\u帧)\
$(对于((i=1;一种溶液的离子)
您可以使用ffmpeg的选择过滤器,该过滤器允许您使用序列帧编号计算表达式,并决定是否跳过它(如果未跳过,则将其发送到哪个输出)

例如,要生成第二个视频,其中每次将拆分为四个视频,请执行以下操作:

ffmpeg -i input_video -vf select='not(mod(n-1\,4)), setpts=0.25*PTS' -an output_video
如果要拆分为不同的数字,请更改
4
,如果需要不同的选择,请更改
1
(因此,对于四个,您将运行四次,从不减去任何内容开始,到减去三结束)

-vf…-一个
片段是为了让视频以正确的速度播放,并具有正确的长度(这需要删除任何音频曲目)

一次性解决方案 选择过滤器还可以分割文件并分别保存每个输出。下面是一个命令,该命令将文件分割为k个输出(如果需要不同的扩展名,请更改.mp4)

k=4;ffmpeg-i输入文件-an-filter\u complex“setpts=`bc-l逐个解决方案
您可以使用ffmpeg的选择过滤器,该过滤器允许您使用序列帧编号计算表达式,并决定是否跳过它(如果未跳过,则将其发送到哪个输出)

例如,要生成第二个视频,其中每次将拆分为四个视频,请执行以下操作:

ffmpeg -i input_video -vf select='not(mod(n-1\,4)), setpts=0.25*PTS' -an output_video
如果要拆分为不同的数字,请更改
4
,如果需要不同的选择,请更改
1
(因此,对于四个,您将运行四次,从不减去任何内容开始,到减去三结束)

-vf…-一个
片段是为了让视频以正确的速度播放,并具有正确的长度(这需要删除任何音频曲目)

一次性解决方案 选择过滤器还可以分割文件并分别保存每个输出。下面是一个命令,该命令将文件分割为k个输出(如果需要不同的扩展名,请更改.mp4)



k=4;ffmpeg-i INPUT_FILE-an-filter_complex”setpts=`bc-l这应该可以使用ffmpeg中的'select'过滤器。我将尝试编写一个答案。Aww❤️ 类似于
select='not(mod($i+n\,100))'
i={0..$n}
。谢谢!我现在正在尝试。是的,没错。看起来应该可以一次完成所有视频,只需调用
ffmpeg
,而不调用
进行
循环?是的。我正在阅读关于多个输出的文档。这应该可以使用ffmpeg中的“选择”过滤器。我会尝试写一篇文章回答,啊❤️ 类似于
select='not(mod($i+n\,100))'
i={0..$n}
。谢谢!我现在正在尝试一下。是的,没错。看起来应该可以一次完成所有视频,只需调用
ffmpeg
,而不调用
进行
循环?是的。我正在阅读关于多个输出的文档。
n-1
n+1
?这有关系吗?为什么要减法?求和对我来说,ing更符合逻辑。我想它不会改变任何东西。如果你减去,那么数字与输出的顺序匹配。如果你加,那么你得到的是相反的顺序。在一个接一个的解决方案中,第二个VF将覆盖第一个。你必须链接过滤器。我刚刚尝试了你发布的第一行。我得到帧
1 5 9 13 1721…
。因此,我认为仍然存在一些问题,因此,一切都很好,但每个视频的第二帧都是复制的。因此,我有
0 4 4 8…
1 5 9…
2 6 6 10…
3 7 11…
。VLC不喜欢视频长度,不允许我逐帧
240
292
,但目前这不是问题。(我的测试视频有
294
帧。)
n-1
n+1
?这有关系吗?为什么要减法?对我来说,求和更符合逻辑。我想这不会改变任何事情。如果减法,则数字与输出顺序匹配。如果相加,则以相反顺序获得。在逐个解决方案中,第二个VF将覆盖第一个VF。您必须链接filters。我刚刚试过你发布的第一行。我得到了帧
1 5 9 13 17 21…
。所以,我认为仍然存在一些问题,所以,一切都很好,但第二帧,每一个视频,都是复制的。所以,我有<