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
Video 如何插入帧以补偿捕获过程中丢失的帧_Video_Ffmpeg_Screen Capture_Frame Rate - Fatal编程技术网

Video 如何插入帧以补偿捕获过程中丢失的帧

Video 如何插入帧以补偿捕获过程中丢失的帧,video,ffmpeg,screen-capture,frame-rate,Video,Ffmpeg,Screen Capture,Frame Rate,我最初的剪辑是22:47。我在avi中用Ut视频无损编解码器以29.97 fps的速度捕获了视频,并使用pcm 16位无符号音频。 我正在使用Virtualdub和VHScrCap驱动程序进行捕获。 Virtualdub、mpc和potplayer播放捕获的文件显然太快,但在前3-4分钟的音频音高正确,但在视频的其余部分音高较高。持续时间为19:06,比mediainfo确认的最初22:47短 问题的原因似乎是我在捕获大高清帧时丢失了更多帧 规则编码 将捕获的剪辑编码为mp4: ffmpeg -

我最初的剪辑是22:47。我在avi中用Ut视频无损编解码器以29.97 fps的速度捕获了视频,并使用pcm 16位无符号音频。 我正在使用Virtualdub和VHScrCap驱动程序进行捕获。 Virtualdub、mpc和potplayer播放捕获的文件显然太快,但在前3-4分钟的音频音高正确,但在视频的其余部分音高较高。持续时间为19:06,比mediainfo确认的最初22:47短 问题的原因似乎是我在捕获大高清帧时丢失了更多帧

规则编码

将捕获的剪辑编码为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重拍视频和音频: 一,

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分钟外,整个视频的音高都是正常的,可预测的是,前2-3分钟的音高太低了

我有一种感觉,1捕获日志和ffprobe提供了显示“瞬时”真实帧速率的逐帧信息,2 ffmpeg编码不使用该信息,但可能通过插入重复或插值帧来恢复正确的帧速率,从而用于纠正帧速率。我怀疑我可以从1中获得信息,但不知道如何做2


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

如果有人感兴趣,我的立场如下

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

重新启动计算机以消除在尝试捕获时正在运行的旧进程。 在Windows任务管理器中查找任何不必要的进程,并将其杀死。 尝试要捕获的帧的大小。这取决于CPU的处理能力。我发现我不应该尝试捕捉1920x1080,我有一个Intel i7-3770K,可能高于平均水平,但我可以捕捉1280x720。 我将捕获帧速率设置为23.976 fps NTSC,这比29.97 fps容易。 选择一个无损且需要尽可能少的处理能力的编码器。我使用UT视频编解码器YUV420进行视频和无音频压缩PCM。有鉴于此,您需要足够的GB来存储捕获的视频。一小时可能需要20GB。我使用一个使用ffmpeg的脚本单独进行压缩,并将20GB以上的视频编码到一个500MB的文件中 考虑到这些预防措施,我可以在几乎不丢失帧的情况下拍摄这些视频,然后平滑播放

进一步研究:我一直在想,用更低的帧速率换取更高的清晰度是否是一个好的折衷方案。例如,以20 fps而不是23.976的速度拍摄,然后找到一种稍后添加帧的方法,这种方法不会使眼睛感到震惊。我假设应该使用avisynth的ConvertFPS函数来完成,而不是ffmpeg。我还没有对这种方法做过任何实验

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