如何使用FFmpeg的hevc_nvenc编码出与OBS兼容的视频以支持concat滤镜无损拼接?
如何使用FFmpeg的hevc_nvenc编码出与OBS兼容的视频以支持concat滤镜无损拼接?
首先得明确:用-c copy实现的无损拼接,要求两段视频的所有编码核心参数完全一致,哪怕有一点点差异,解码器切换时就可能出现画面损坏的情况。你遇到的“FFmpeg视频放前面正常、放后面就崩”的情况,本质就是你用FFmpeg编码的视频和OBS录的视频在某些关键参数上不匹配——解码器先加载OBS的参数后,无法适配FFmpeg视频的差异参数;反过来先加载FFmpeg参数时,OBS视频能兼容这个参数,所以能正常播放。
接下来给你一步步解决问题:
第一步:获取OBS录制视频的准确编码参数
先用ffprobe导出OBS视频的详细编码信息,命令如下:
ffprobe -v error -show_streams 你的OBS录制视频.mkv
重点记录这些关键参数:
- 视频流:
codec_name(确认是hevc)、profile、level、pix_fmt(像素格式,比如yuv420p或yuv420p10le)、r_frame_rate(帧率,比如30/1或30000/1001)、time_base、gop_size(关键帧间隔) - 音频流:
codec_name(应该是aac)、sample_rate、channels、channel_layout、profile(比如aac_lc)
第二步:调整FFmpeg编码命令,完全对齐OBS参数
你原来的命令缺少很多和OBS对齐的关键参数,我给你基于常见OBS HEVC设置调整的示例,你再根据第一步拿到的参数微调:
ffmpeg -hide_banner -filter_complex @" color=c=green:s=1440x900:framerate=30:d=5[xv]; # framerate必须和OBS的完全一致 anullsrc=channel_layout=stereo:sample_rate=48000[xa]; # 音频参数对齐OBS [xv]drawtext=text='BLABLABLA':fontcolor=black:fontsize=64:x=(w-text_w)/2:y=(h-text_h)/2[xv]; "@ -map [xv] -map [xa] ^ -c:v hevc_nvenc -preset slow -tune hq ^ -profile:v main -level 4.0 ^ # 严格对齐OBS的profile和level参数 -rc cbr -b:v 2500k ^ -g 30 -keyint_min 30 ^ # 关键帧间隔和帧率一致(OBS通常每秒1个关键帧) -pix_fmt yuv420p ^ # 像素格式必须和OBS完全一致,10bit就用yuv420p10le -time_base 1/90000 ^ # 对齐OBS视频的time_base -c:a aac -profile:a aac_lc -sample_fmt fltp ^ # 音频profile和采样格式对齐OBS -t 5 rendText.mkv
几个核心调整点的说明:
- 像素格式:OBS录HEVC默认用yuv420p,而hevc_nvenc可能默认用其他格式(比如yuv444p),必须显式指定
-pix_fmt - GOP结构:OBS的关键帧间隔一般等于帧率(30fps就是30帧一个关键帧),加上
-g和-keyint_min确保和OBS一致 - 编码级别:只指定profile不够,必须加上
-level对齐OBS的设置 - 时间基:不同的time_base会导致拼接时时间轴混乱,必须严格对齐
- 音频参数:加上
-profile:a aac_lc确保和OBS的AAC编码profile一致
第三步:验证参数一致性并测试拼接
用ffprobe分别检查你新生成的视频和OBS视频的参数,确认所有关键参数完全匹配后,再用你的concat命令测试:
ffmpeg -f concat -safe 0 -i delmeVids.txt -c copy -reset_timestamps 1 output.mkv
这样调整后,应该就能实现无损拼接,不管FFmpeg视频放在哪个位置都能正常播放了。
备注:内容来源于stack exchange,提问作者Podbrushkin
相关产品推荐
相关产品推荐

