ffmpeg concatena arquivos ts sem perder qualidade

0

Eu tenho um arquivo main.mp4 que eu divido em dois arquivos mp4; first_half.mp4 e second_half.mp4 . Usando ffmpeg eu então mesclo três arquivos um na frente: um no meio de first_half.mp4 e second_half.mp4 , e um no pós second_half.mp4

Para unir os arquivos, primeiro converto-os em .ts format e juntei-os usando o protocolo concat. O problema é que a qualidade se torna horrível e pixelizada. Depois de inspecionar os fragmentos divididos, descobri que a qualidade deles estava boa e a qualidade só depreciava quando eu converti para .ts .

Como posso manter a qualidade dos arquivos ts iguais aos arquivos originais?

Eu também tentei demuxer de concat, mas ele mantém a qualidade, mas só funciona para o primeiro arquivo, pois acaba distorcendo os arquivos subseqüentes.

Aqui estão meus comandos:

// 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);
    
por user2293554 12.10.2016 / 19:46

1 resposta

1

Em todos os comandos 'transcodificar', remova o in

por exemplo. -f mpegts in first_half.ts - > -f mpegts first_half.ts

Agora, nenhum dos seus comandos está realmente transcodificando, pois você especificou -vcodec copy -acodec copy . Para realmente transcodificar, remova -vcodec copy . Você também pode pular os MP4s intermediários. por exemplo,

ffmpeg -i main.mp4 -vcodec libx264 -acodec copy -ss 00:00:00 -t 00:15:00 first_half.ts -y
    
por 12.10.2016 / 20:45

Tags