我有一个文件main.mp4
,我把它分成两个 mp4 文件;first_half.mp4
和second_half.mp4
。然后使用 ffmpeg 合并三个文件,一个在前面,一个在first_half.mp4
和中间second_half.mp4
,一个在后面second_half.mp4
为了合并文件,我首先将它们转换为.ts
格式,然后使用 concat 协议将它们合并。问题是质量变得很糟糕并且像素化。检查分割的片段后,我发现它们的质量还可以,而且只有当我转换为 时质量才会下降.ts
。
我怎样才能保持 ts 文件的质量与原始文件相同?
我也尝试过 concat demuxer,但它可以保持质量,但只适用于第一个文件,因为它最终会扭曲后续文件。
这是我的命令:
// cut first half
$cmd ="ffmpeg -i main.mp4 -vcodec copy -acodec copy -ss 00:00:00 -t 00:15:00 first_half.mp4 -y";
shell_exec($cmd);
//convert to ts
$cmd = "ffmpeg -i first_half.mp4 -vcodec copy -acodec copy -bsf:v h264_mp4toannexb -f mpegts in first_half.ts -y -b:v 1000000";
shell_exec($cmd);
//cut second half
$cmd ="ffmpeg -i main.mp4 -vcodec copy -acodec copy -ss 00:15:00 -t $length second_half.mp4 -y";
shell_exec($cmd);
//convert to ts
$cmd = "ffmpeg -i second_half.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts in second_half.ts -y -b:v 1000000";
shell_exec($cmd);
//transcode the "slices"
$cmd = "ffmpeg -i front.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts in front.ts -y -b:v 1000000";
shell_exec($cmd);
$cmd = "ffmpeg -i middle.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts in middle.ts -y -b:v 1000000";
shell_exec($cmd);
$cmd = "ffmpeg -i end.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts in end.ts -y -b:v 1000000";
shell_exec($cmd);
//concatenate them
$cmd = 'ffmpeg -i "concat:front.ts|first_half.ts|middle.ts|second_half.ts|end.ts" -c copy output.mp4 -y -b 10000000';
shell_exec($cmd);
答案1
在所有“转码”命令中,删除in
例如-f mpegts in first_half.ts
-->-f mpegts first_half.ts
现在,由于您已指定,因此所有命令实际上都不是转码命令-vcodec copy -acodec copy
。要实际转码,请删除-vcodec copy
。您还可以跳过中间 MP4。例如
ffmpeg -i main.mp4 -vcodec libx264 -acodec copy -ss 00:00:00 -t 00:15:00 first_half.ts -y