ffmpeg 连接 ts 文件而不损失质量

ffmpeg 连接 ts 文件而不损失质量

我有一个文件main.mp4,我把它分成两个 mp4 文件;first_half.mp4second_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

相关内容