我的 GPU 是Nvidia GTX 550 ti,我应该提取视频文件的所有帧以供工作。
我的 GPU 不支持最新版本的 CUDA。
我尝试了多种软件来使用我的 GPU 进行帧提取,但它们都使用我的 CPU。
是否有任何软件或方法可以使用我的 GPU 卡提取视频的所有帧?
请完整解释您对我的问题的解决方案(必须安装哪个版本以及...)
请注意,我没有足够的预算来购买新的 GPU 卡
我已经找到了许多使用 ffprobe 查找视频中关键帧位置的解决方案,但它们都很慢,例如 8k 视频的实际时间大约是 0.1 倍。
虽然这对于在视频开头附近找到关键帧来说很好,但我不想等待 10 个小时来找到 1 小时标记附近关键帧的位置。
有谁知道如何快速获取时间戳之前或之后关键帧的位置?
慢速回答示例:
如何使用 FFmpeg 获取给定时间戳之前最近关键帧的时间戳?
使用 FFmpeg 获取给定时间戳之前关键帧的时间戳
在 FFMPEG / Python 中获取视频中的 I 帧列表
我正在尝试连接 2 个音频文件,它们之间有 5 秒的静音时间。这还会为视频添加一个静止图像。
我正在遵循这里相同示例如何使用 ffmpeg 在曲目之间添加特定长度的静音?
ffmpeg \
-loop 1 -i image.jpg
-i audio1.wav \
-f lavfi -t 5 -i anullsrc \
-i audio2.wav \
-filter_complex "[1:a][2:a][3:a]concat=n=3:v=0:a=1[outa]" \
-map 0:v -c:v copy \
-map "[outa]" -c:a aac -b:a 192k \
-shortest \
out.mkv
这正确地将音频与 5 秒的静音连接起来,但是这会创建一个mkv
无限长的文件,并且在连接的音频结束后会保持静音。我查看了文档,但没有发现任何明显的错误。我以为该-shortest
选项可以防止这种情况发生,但事实并非如此。
我该如何修复这个问题,让它在连接音频的末尾停止?
我尝试使用 yt-dlp 和 ffmpeg 一步剪切并下载 vk.com 上在线视频的一部分。
我试过
ffmpeg $(yt-dlp -g 'https://vk.com/video302700968_456241462' | sed 's/^/-ss 05:00 -i /') -t 00:30 -c copy output.mkv
和ffmpeg -ss 00:05:00 -to 00:05:30 -i "$(yt-dlp --get-url 'https://vk.com/video302700968_456241462')" -c:v copy -c:a copy output.mp4
但任何一个命令都会返回Error opening input files: Server returned 400 Bad Request
。
如何让它工作?
该视频制作于 1916 年,不受版权保护。
这是原始命令,它删除了命令中指定的开始和结束之间的部分:
ffmpeg -i input.ext -vf "select='not(between(t,start,end))', setpts=N/FRAME_RATE/TB" -af "aselect='not(between(t,start,end))', asetpts=N/SR/TB" output.ext
有没有更好的不需要重新编码的选项?或者至少更快?
请记住,我想要的命令是删除开始和结束之间的部分而不是返回它。
例如,这不是我正在寻找的:
ffmpeg -ss start -i input.mp4 -c copy -t end output.mp4
假设我需要删除视频中除第二分钟之外的所有内容。
例如,我可以按照以下方式执行此操作:
ffmpeg -copyts -ss <start> -i input.mp4 -to <end> -c:v libx264 -crf 23 -c:a aac -b:a 192k output.mp4
我感兴趣的是应该-ss
在之前还是之后-i
。
我已经阅读了这里和这里的所有答案和评论。从我在那里读到的内容来看,似乎在 FFmpeg 的旧版本(2.1 之前)中,放置-ss
在前面-i
是为了更快地处理,而放置-ss
在后面-i
是为了更准确的处理,但在较新的版本中,放置-ss
在前面-i
不仅是为了更快地处理,也是为了更准确的处理。
但另一方面,这里的“输入寻求”和“输出寻求”部分没有提到这个细微差别,阅读之后我不太确定放在-ss
前面-i
是否是“唯一的解决方案”。
有人能解释一下吗?(我希望处理准确。我不关心需要多长时间。)
基本上我想从视频中提取所有帧,其中图像大小将调整为 720p。所有这些我都知道该怎么做。但为了测试我想提取每第 N 帧。因此,30FPS 视频中的每 30 张图像或每 10 张图像等。我该怎么做?
另外,提取的图像文件名应与帧编号相对应,因此不确定第一帧是 0 还是 1?
到目前为止,我已经拼凑了以下命令:
ffmpeg -i input.mp4 -filter_complex "\
[0:v]trim=start=175.2:end=200.9,setpts=PTS-STARTPTS[v1]; \
[0:a]atrim=start=175.2:end=200.9,asetpts=PTS-STARTPTS[a1]; \
[0:v]trim=start=214.3:end=324,setpts=PTS-STARTPTS[v2]; \
[0:a]atrim=start=214.3:end=324,asetpts=PTS-STARTPTS[a2]; \
[v1][a1][v2][a2]concat=n=2:v=1:a=1[outv][outa]" \
-map "[outv]" -map "[outa]" output.mp4
提取剪辑并将它们连接成一个视频效果很好。但是,此命令将视频重新编码为 25fps,如警告所示:
[fc#0 @ 0000029e38732840] [vo0->#0:0 @ 0000029e38739b80] 没有有关输入帧速率的信息。回落到默认值 25fps。如果您想要不同的帧速率,请使用 -r 选项。
我希望它保持原始视频的帧速率,无论它是什么,而不是通过丢弃或插入帧来更改帧速率。如果我使用多个输入文件,我希望它只使用第一个文件的帧速率(因为无论如何它们都会相同)。
我该如何实现这一目标?
我有一个 ffmpeg 命令在输入视频上设置自定义点。
它适用于 .mkv 文件,但不适用于 .mp4 文件。当对 mp4 文件运行以下命令时,大多数帧都会被丢弃。虽然我的pts是单调的并且一直在增加。
ffmpeg -i video.mp4 -filter_complex "[v]setpts='0*eq(N,0)+160*eq(N,1)+191*eq(N,2)+211*eq(N,3)...'[out];" -map [out] out_video.mp4
是否可以对 mp4 文件进行设置?
谢谢!