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

时间:2015-10-14 14:59:31

标签: video ffmpeg screen-capture frame-rate

我原来的剪辑时间是22:47。我使用Ut Video Lossless Codec以29.97 fps的速度捕获视频,带有pcm 16位无符号音频。 我正在使用Virtualdub和VHScrCap驱动程序进行捕获。 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给出逐帧信息,显示什么是'瞬时'实际帧速率,以及(2)ffmpeg编码不使用该信息,但可能是可以通过插入重复或插值帧来恢复正确的帧速率来校正帧速率。我怀疑我可以从(1)获得信息,但不知道如何做(2)。

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

1 个答案:

答案 0 :(得分:0)

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

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

  • 重新启动计算机以消除尝试捕获时正在运行的旧进程。
  • 在Windows任务管理器中查找任何不必要的进程,并将其终止。
  • 尝试要捕获的帧的大小。这取决于CPU的处理能力。我发现我不应该尝试捕获1920x1080(我的Intel i7-3770K可能高于平均值),但我可以做到1280x720。
  • 我将捕获帧速率设置为23.976 fps(NTSC),这比29.97 fps更容易。
  • 选择无损编码器,并尽可能减少处理能力。我使用UT视频编解码器YUV420进行视频和无音频压缩(PCM)。鉴于此,您需要大量的GB来存储捕获的视频。它可能需要20GB一小时。 (我使用一个使用ffmpeg并将20GB +视频编码为500 MB文件的脚本单独进行压缩)

考虑到这些预防措施,我可以捕捉这些视频,几乎没有丢帧,然后顺利播放。

进一步研究:我一直想知道为更高的定义交换较低的帧速率是否可以是一个很好的权衡。例如,以20 fps而不是23.976捕获,然后找到一种方法,稍后以不会震惊眼睛的方式添加帧。 (我假设应该用avisynth的ConvertFPS()函数来完成,而不是ffmpeg)我还没有对这个方法做过任何实验。