使用FFmpeg合并视频异常:YouTube下载视频播放变慢问题求助
FFmpeg合并视频异常:YouTube下载视频播放变慢问题求助
嗨,我之前也碰到过一模一样的问题!看起来你已经检查了编码格式和分辨率,但FFmpeg的视频拼接对底层参数的一致性要求特别高,只匹配codec和分辨率还不够,大概率是两个视频的帧率、时基或者关键帧设置不匹配导致的,给你几个排查和解决的方向:
第一步:先确认两个视频的详细参数差异
先别着急拼接,先用ffprobe命令把两个视频的核心参数拉出来对比,命令如下:
# 检查你生成的截图视频参数 ffprobe -v error -show_entries stream=codec_name,width,height,r_frame_rate,time_base,codec_type screenshot.mp4 # 检查YouTube下载的视频参数 ffprobe -v error -show_entries stream=codec_name,width,height,r_frame_rate,time_base,codec_type input2.mp4
重点看这几个参数:
r_frame_rate:帧率,YouTube视频经常是29.97fps而不是标准30fps,肉眼看差一点,但拼接后会导致播放速度异常time_base:时基,这个是视频时间戳的基准,两个视频必须一致- 如果有音频,还要看音频的采样率、声道数,比如一个是44100Hz一个是48000Hz也会出问题
第二步:两种解决方法任选其一
方法1:统一参数后再用流复制拼接
如果查到参数不一致,先把你的截图视频重新生成,对齐YouTube视频的参数。比如假设YouTube视频是29.97fps、时基1/1000,那调整生成命令:
ffmpeg -y -loop 1 -i screenshot.png -filter_complex "[0:v]scale=1920x1080,subtitles=subs.srt" -c:v libx264 -c:a aac -r 29.97 -time_base 1/1000 -g 30 -shortest -t 5 screenshot_aligned.mp4
这里-r指定帧率,-time_base对齐时基,-g 30设置关键帧间隔(和YouTube视频保持一致),之后再用你原来的concat命令就可以了:
ffmpeg -f concat -safe 0 -i input.txt -c copy output.mp4
方法2:转成拼接友好的中间格式(更省心)
如果不想纠结参数,直接把两个视频转成mpegts格式(这种格式天生适合拼接,对参数兼容性高),再合并:
# 把截图视频转成ts格式 ffmpeg -i screenshot.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts temp1.ts # 把YouTube视频转成ts格式 ffmpeg -i input2.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts temp2.ts # 合并两个ts文件 ffmpeg -i "concat:temp1.ts|temp2.ts" -c copy -bsf:a aac_adtstoasc output.mp4
这种方法几乎能解决90%以上的FFmpeg拼接参数不兼容问题,亲测有效!
为什么之前的命令不行?
你之前用的-c copy是流复制模式,它不会重新编码视频,只是把原视频的流直接拼起来,这要求两个视频的所有编码参数、时基、帧率完全一致,否则播放器会用第一个视频的参数去解码第二个,就会出现播放变慢/变快的情况;而concat:协议同样有这个限制,所以必须先统一参数或者转成兼容的中间格式。
备注:内容来源于stack exchange,提问作者Sulli
相关产品推荐
相关产品推荐

