如何插入帧以补偿捕获期间丢失的帧

How to insert frames to compensate for frames lost during capture

我的原始剪辑 22:47 长。我使用 Ut Video Lossless Codec 以 29.97 fps 的速度捕获了 avi 格式的视频,带有 pcm 16 位无符号音频。 我正在使用带有 VHScrCap 驱动程序的 Virtualdub 进行捕获。 Virtualdub、mpc 和 potplayer 播放捕获的文件显然速度太快,但前 3-4 分钟的音频音调正确,但视频其余部分的音调高。时长19:06,比原来的22:47短(经mediainfo证实) 问题的原因似乎是我在捕获大高清帧时丢失了更多帧。

常规编码

将捕获的剪辑编码为 mp4:

ffmpeg -ss 3.25 -i input.avi -map 0:0 -map 0:1 -threads 0 -c:v libx264 -profile:v main \
-preset:v medium -level 3.1 -x264opts crf=26.0 -aspect 16:9 -t 1112.69 \
-y -f mp4 -vf "crop=1432:808:4:46, hqdn3d=1.5:1.5:6:6, \
scale=1216:684, pad=1280:720:32:18" -c:a ac3 -ac 2 -ar 48000 -b:a 160k \
output.mp4

输出是18:32长,帧率仍然是29:97。前 2 分钟的音频音调还可以,视频其余部分的音调太高了。

正在努力更正

我尝试通过以下三个步骤来纠正它:(1) 对速度减慢到 23.976 fps 的视频流进行编码并提取 wav 音频流,(2) 降低音频的速度和音调,以及 (3) 重新混合视频和音频: (1)

ffmpeg -ss 3.25 -i input.avi -threads 0 \
-c:v libx264 -profile:v main -preset:v medium -level 3.1 -x264opts crf=26.0 \
-aspect 16:9 -t 1390.862 -an -y -f mp4 -r 24000/1001 \
-vf "crop=1432:808:4:46, hqdn3d=1.5:1.5:6:6, scale=1216:684, pad=1280:720:32:18, \
setpts=1.25*PTS" video_out.mp4  \
-t 1112.69 -y -vn -f wav  audio_out.wav

(2) 然后用 sox 降低 wav 音频流的音调:

sox --norm audio_out.mp4.wav audio_out-24.wav speed 0.8

(3) 然后将两个流重新混合:

ffmpeg -i video_out.mp4 -i audio_out-24.wav -map 0:0 -map 1:0 -c:v copy \
-c:a ac3 -ac 2 -af aresample=resampler=soxr -ar 48000 -b:a 160k \
final_output.mp4

这一次,视频时长 (23:10) 更接近原版,整个视频的音调都还可以,除了前 2-3 分钟,那里(可以预见)太低了。

我觉得 (1) 捕获日志和 ffprobe 逐帧提供显示 'instantaneous' 实际帧速率的信息,以及 (2) ffmpeg 不使用该信息编码,但大概可用于通过插入重复或内插帧来恢复正确的帧速率来校正帧速率。我怀疑我可以从 (1) 中获取信息,但不知道如何做 (2)。

如果熟悉此类问题的人可以给我一些建议,并指出正确的方向,我将不胜感激。

好吧,如果有人有兴趣,这就是我的立场。

我不确定这是否是答案,但这是我目前的答案。我发现尝试纠正和改进拍摄不佳的视频并不是一个好主意。这就是我现在正在尝试做的事情,以避免在捕获过程中丢失帧并获得高质量的视频。 注意:判断捕获是否良好的一种简单方法是观察插入帧的数量与捕获的总帧数。 (我用VirtualDub抓取,那些数字是实时显示的)。尝试获得零插入帧。

  • 重新启动计算机以消除那些在您尝试捕获时 运行 的旧进程。
  • 在 Windows 任务管理器中查找任何不需要的进程,然后将其杀死。
  • 试验您要捕获的帧的大小。这取决于您 CPU 的处理能力。我发现我不应该尝试捕捉 1920x1080(我有一个 Intel i7-3770K,可能高于平均水平),但我可以捕捉 1280x720。
  • 我将捕获帧速率设置为 23.976 fps (NTSC),这比 29.97 fps 更容易。
  • Select 一种无损且需要尽可能少的处理能力的编码器。我将 UT Video Codec YUV420 用于视频,没有音频压缩 (PCM)。鉴于此,您需要大量 GB 来存储捕获的视频。一个小时可能需要 20GB。 (我使用使用 ffmpeg 的脚本单独进行压缩,并将 20GB 以上的视频编码为 500 MB 的文件)

有了这些预防措施,我可以捕捉到这些几乎没有丢帧的视频,然后流畅地播放。

进一步研究:我一直在想用较低的帧速率换取更高的清晰度是否是一个很好的权衡。例如,以 20 fps 而不是 23.976 的速度捕捉,然后找​​到一种方法在以后添加帧时不会震撼眼睛。 (我认为应该使用 avisynth 的 ConvertFPS() 函数来完成,而不是 ffmpeg)我还没有对这种方法进行任何实验。