我使用ffmpeg能够在录制时分割视频,这样我就可以在没有硬盘填满的情况下持续录制。
它工作得很好,期望音频在文件段时从视频中失去同步。视频似乎没有中断,但是当我稍后加入片段时,我实际上可以听到音频中的微小跳跃。有人会认为ffmpeg会在分段期间将数据包存储在一个队列中,所以没有任何东西丢失,但似乎并非如此......我有什么方法可以强迫它做类似的事情?
这是我目前的阻止:
ffmpeg -y -thread_queue_size 5096 -f dshow -video_size 3440x1440 -rtbufsize 2147.48M -framerate 100 -pixel_format nv12 ^
-itsoffset 00:00:00.012 -i video="Video (00 Pro Capture HDMI 4K+)" -thread_queue_size 5096 -guess_layout_max 0 -f dshow ^
-rtbufsize 2147.48M -i audio="SPDIF/ADAT (1+2) (RME Fireface UC)" -map 0:0,1:0 -map 1:0 -c:v h264_nvenc -preset: llhp ^
-pix_fmt nv12 -b:v 250M -minrate 250M -maxrate 250M -bufsize 250M -b:a 384k -ac 2 -r 100 -vsync 1 ^
-max_muxing_queue_size 5096 -segment_time 600 -segment_wrap 9 -f segment C:\Users\djcim\Videos\PC\PC\PC%02d.mp4
我正在推迟视频流,因为它超出了音频,它远远超过音频。
PS:aresample或async似乎没有效果,或者至少不是理想的效果。
答案 0 :(得分:0)
将-reset_timestamps与编码.ts结合使用而不是.mp4主要解决了这个问题。 -reset_timestamps在编码.mp4时似乎不起作用,不确定原因,可能是一个bug?
我之所以这么说,主要是因为音频在第一段之后仍然在一个帧周围漂移,但不是指数级的。我发现一帧可以接受音频去同步。虽然我现在应该提一下,当我尝试将剪辑连接在一起时,我有音频漂移问题,但并非总是如此,但有时候。使用aresample = async = 250修复了concat之后的漂移,但是这样做时你可以听到音频拉伸。不能期望一切都能完美运作。
ffmpeg - y -thread_queue_size 9999 -indexmem 9999 -guess_layout_max 0 -f dshow -video_size 3440x1440 -rtbufsize 2147.48M ^
-framerate 200 -pixel_format nv12 -i video="Video (00 Pro Capture HDMI 4K+)":audio="SPDIF/ADAT (1+2) (RME Fireface UC)" ^
-map 0:0,0:1 -map 0:1 -flags +cgop -force_key_frames expr:gte(t,n_forced*2) -c:v h264_nvenc -preset: llhp -pix_fmt nv12 ^
-b:v 250M -minrate 250M -maxrate 250M -bufsize 250M -c:a aac -ar 44100 -b:a 384k -ac 2 -r 100 ^
-af "atrim=0.038, asetpts=PTS-STARTPTS, aresample=async=250" -vsync 1 -ss 00:00:01.096 -max_muxing_queue_size 9999 ^
-f segment -segment_time 600 -segment_wrap 9 -reset_timestamps 1 C:\Users\djcim\Videos\PC\PC\PC%02d.ts