У меня есть один файл 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 ответ1

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .