algorithm - 从 n0 初始帧开始,每 N 帧采样一次视频

标签 algorithm video ffmpeg sampling

问题

我想知道如何对视频流进行采样 x[n]每个N帧,从帧 n_i 开始, i < N , 所以我最终得到 N长度的新视频 len(x) / N .

在公式中,这很简单:y_i[n] = x[n_i + n * N] .

这里有一张我想要实现的图表: sampling

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

实现

最后,我设法编写了最终实现,为了完整起见,我在此报告。
它确实将最小尺寸缩放到 256 , 不处理超过 max_frames ;每隔 k 执行一次采样帧,发送第一个k - 1样本到一个文件夹和 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"
    )

最佳答案

一对一解决方案

您可以使用 ffmpeg 的 select 过滤器,它允许您使用连续帧编号评估表达式,并决定是否跳过它(如果不跳过,则将其发送到哪个输出)。

例如,要生成每次分成四个的第二个视频,您可以执行以下操作:

ffmpeg -i input_video -vf select='not(mod(n-1\,4)), setpts=0.25*PTS' -an output_video

如果您要分成不同的数字,请更改 4,如果您想要不同的选择,请更改 1(因此对于四个,您将运行它四次,开始不减去任何东西,以减去三结束。

-vf ... -an 片段是为了让视频以正确的速度播放,并具有正确的长度(这需要删除任何音轨)。

一次性解决方案

select 过滤器还可以拆分文件并分别保存每个输出。这是一个将文件拆分为 k 个输出的命令(如果您想要不同的扩展名,请更改 .mp4)。

k=4;ffmpeg -i INPUT_FILE -an -filter_complex "setpts=`bc -l <<< 1/$k`*PTS[m];[m]select=n=$k:e=mod(n\,$k)+1`for ((i=1; i<=$k; i++)); do echo -n "[a$i]"; done`" `for ((i=1; i<=$k; i++)); do echo -n "-map [a$i] out$i.mp4 "; done`

命令中的循环只是写出 [a1][a2]...-map [a1] out1.mp4...。除此之外,修改是使用 filter_complex,这在处理多个输出时是必需的,并且更改过滤器以将每个帧定向到它自己的输出 mod k。

关于algorithm - 从 n0 初始帧开始,每 N 帧采样一次视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43128847/

相关文章:

Python loadarff 对字符串属性失败

objective-c - cocoa ffmpeg 流创建了不正确的文件

php - 在 URL 中公开类和方法名称是否不安全?

java - 卡格尔算法

algorithm - 骨肉 |找到 K 以下的 B 个不同的正整数,使得它们的和为 N 或者说不可能。 |超时错误

javascript - 灯箱中的 jQuery 视频

ios - 如何正确使用 AVPlayer 使其在播放视频前不显示白屏?

algorithm - haskell快速排序复杂度?

android - FFmpeg - 在多个调用中将帧添加到 MP4

android - 将 opus 音频 rtp 流式传输到 android 设备