用户现在需要用 ffmpeg 合并两个 MP4 文件,并且重新编码。首先得分析源文件的信息:视频是 HEVC (h265) Main,1080p,30fps;音频是 AAC LC,44100Hz 立体声。
首先,合并并重新编码的步骤,首先要考虑两种常见的方式:一种是先创建文件列表,然后用 ffmpeg 读取列表,重新编码输出;另一种是直接输入两个文件,但列表方式更可靠,尤其是不同编码的情况(不过这里是重新编码,所以列表更合适)。
首先,步骤分解:
创建文件列表(比如 list.txt),内容格式是 file ' 路径 / 文件名.mp4',注意路径和引号,比如:
file '6.mp4'
file '7.mp4' (假设第二个文件是 7.mp4)
然后用 ffmpeg 命令,指定重新编码的参数。需要考虑视频编码器、音频编码器、码率、分辨率、帧率等,保持和源文件匹配或调整。
源文件视频是 h265 (hevc),1080p,30fps,码率约 1013kb/s;音频是 aac LC,44100Hz 立体声,149kb/s。
首先,重新编码的参数选择:
- 视频编码器:可以选 h264 (libx264) 兼容性更好,或者继续用 h265 (libx265) 保持源格式。
- 音频编码器:aac (libfdk_aac 更好,因为用户的 ffmpeg 编译了 libfdk-aac,或者默认的 aac)
- 码率:视频码率可以设为 1000k 左右(和源接近),音频 150k 左右。
- 帧率:30fps,分辨率 1080p。
- 其他参数:比如 preset(x264/x265 的预设,平衡速度和质量,比如 medium),crf(恒定质量,比固定码率更好)。
首先,先写创建列表的步骤,然后写 ffmpeg 命令,解释每个参数的含义。
另外,要注意用户的 ffmpeg 编译了 libx264、libx265、libfdk-aac 等,所以可以用这些编码器。
现在,详细的命令和解释:
首先,创建 list.txt:
在终端里,比如:
echo "file '6.mp4'" > list.txt
echo "file '7.mp4'" >> list.txt (替换 7.mp4 为第二个文件的实际名称)
然后,ffmpeg 命令:
方案 1:重新编码为 h265 (hevc),保持源格式,恒定质量(CRF),音频用 fdk_aac:
ffmpeg -f concat -safe 0 -i list.txt -c:v libx265 -crf 28 -preset medium -c:a libfdk_aac -b:a 150k -r 30 -s 1920x1080 -pix_fmt yuv420p -ar 44100 -ac 2 output.mp4
方案 2:重新编码为 h264 (libx264),兼容性更广:
ffmpeg -f concat -safe 0 -i list.txt -c:v libx264 -crf 23 -preset medium -c:a libfdk_aac -b:a 150k -r 30 -s 1920x1080 -pix_fmt yuv420p -ar 44100 -ac 2 output.mp4
然后解释每个参数的含义:
- -f concat:使用 concat 分离器,处理文件列表
- -safe 0:允许读取任意路径的文件(如果文件在当前目录,也可以不加,但加了更保险)
- -i list.txt:输入文件列表
- -c:v libx265/libx264:视频编码器,libx265 是 h265,libx264 是 h264
- -crf:恒定质量参数,x264 的 CRF 23 是默认(越小人质量越高,18-28 是合理范围);x265 的 CRF 28 约等于 x264 的 23,质量相近,文件更小
- -preset:编码预设,medium 是平衡(fast 更快但文件大,slow 更慢但文件小)
- -c:a libfdk_aac:音频编码器,libfdk_aac 比默认的 aac 质量更好(用户的 ffmpeg 编译了这个,所以可用)
- -b:a 150k:音频码率,和源文件的 149k 接近
- -r 30:帧率,和源文件 30fps 一致
- -s 1920x1080:分辨率,1080p,和源一致
- -pix_fmt yuv420p:像素格式,和源的 yuv420p 一致,保证兼容性
- -ar 44100:音频采样率,和源一致
- -ac 2:音频声道数,立体声,和源一致
- output.mp4:输出文件
另外,如果用户不想用 CRF,想用固定码率(和源接近),可以替换 CRF 和 preset 为:
对于 x264:-b:v 1000k -bufsize 2000k (bufsize 是码率控制的缓冲区,通常是 2 倍 b:v)
对于 x265:-b:v 1000k -bufsize 2000k
比如:
ffmpeg -f concat -safe 0 -i list.txt -c:v libx264 -b:v 1000k -bufsize 2000k -c:a libfdk_aac -b:a 150k -r 30 -s 1920x1080 -pix_fmt yuv420p -ar 44100 -ac 2 output.mp4
还要注意,如果两个源文件的参数不一致(比如分辨率、帧率不同),需要统一,这里假设两个文件都是 1080p 30fps,否则需要调整参数(比如用 scale 滤镜,或帧率统一)。
另外,补充说明:
- 如果没有 libfdk_aac(虽然用户的 ffmpeg 配置里有 --enable-libfdk-aac,所以可用),可以用默认的 aac 编码器,把 - c:a libfdk_aac 换成 - c:a aac 即可。
- concat 分离器要求文件的编码参数尽量一致,但因为我们是重新编码,所以即使源文件有细微差别,也会被统一编码,所以没问题。
- 步骤总结:创建列表→执行 ffmpeg 命令。
现在,把这些整理成清晰的步骤和命令,解释每个参数,还有注意事项。