É possível unir fluxos H.264 codificados com parâmetros diferentes?

2

Os comandos a seguir geram dois clipes de vídeo H.264, 10 segundos cada, com diferentes parâmetros predefinidos ( veryslow vs veryfast ) e os associam a um único contêiner MP4.

$ ffmpeg -loglevel quiet -f rawvideo -pix_fmt rgba -s 1920x1080 -r 30 -i /dev/zero -pix_fmt yuv420p -c:v libx264 -preset:v veryslow -t 10 part1.mp4
$ ffmpeg -loglevel quiet -f rawvideo -pix_fmt rgba -s 1920x1080 -r 30 -i /dev/zero -pix_fmt yuv420p -c:v libx264 -preset:v veryfast -t 10 part2.mp4
$ cat list
file part1.mp4
file part2.mp4
$ ffmpeg -f concat -i list -c copy join.mp4

Até aí tudo bem. Mas se eu tentar reproduzir esse arquivo com ffplay , recebo muitos erros como "decode_slice_header error", "illegal reordering_of_pic_nums_idc".

Se dois clipes forem codificados com a mesma predefinição, não há problema.

Isso significa que não posso unir dois fluxos H.264 se eles tiverem parâmetros de codificação diferentes, mesmo que seus tamanhos, taxas de quadros e formatos de pixel sejam todos iguais?

    
por hpsMouse 13.05.2014 / 06:35

2 respostas

1

Em geral, você não pode.

A predefinição não resulta em um vídeo diferente, a menos que sua restrição seja a largura de banda, então uma predefinição mais lenta proporcionará melhor eficiência. Mas isso afetará alguns dos parâmetros que o decodificador precisa para se inicializar, e é por isso que provavelmente não é possível lidar com diferentes fluxos de bits.

Pode haver uma possibilidade de ainda concatenar os arquivos no domínio decodificado (por exemplo, usando o filtro de concatenação), mas definitivamente não em um nível bruto de fluxo de bits. O que significa que você precisa recodificar após a concatenação.

O que você pode tentar fazer é concatenar os bytestreams:

ffmpeg -i part1.mp4 -c:v copy -an -f h264 part1.264
ffmpeg -i part2.mp4 -c:v copy -an -f h264 part2.264
cat part1.264 part2.s264 concat.264
ffmpeg -i concat.264 -c:v copy output.mp4

Mas eu não pude tentar isso agora, então sua milhagem pode variar.

    
por 14.05.2014 / 16:20
0

Embora a especificação H.264 e ISOBMFF tenham sintaxe para permitir a alteração do VPS / SPS / PPS durante um fluxo, é provável que um ou ambos

  • O ffmpeg não está esperando isso e não está construindo o arquivo mp4 corretamente
  • o software de reprodução não é capaz de decodificar um arquivo mp4 contendo mais de um conjunto de SPS / PPS.

Se você é capaz de usar um MPEG TS ao invés de um MP4, então veja se você pode trocar as partes para mpegts e então concatenar os dois fluxos de transporte para formar o final ( cat part1.ts part2.ts > join.ts ). É muito mais provável que os decodificadores MPEG TS incluam lógica para analisar uma mudança de SPS / PPS.

    
por 12.08.2017 / 23:17

Tags