Como forçar o primeiro quadro a ser key-frame?

2

Eu quero codificar depois de procurar uma certa posição, e eu quero fazer o primeiro quadro um quadro-chave, aqui o comando que eu usei:

ffmpeg -ss 300  -i howimet.mp4 -acodec libfaac -ar 48000 -ab 128k -ac 2  -vcodec libx264 -vf "scale=480:270" -f mpegts -force_key_frames 300 -t 120 howimet2.ts

o -force_key_frames está definido para buscar posição para fazer um quadro chave lá. Eu uso o seguinte script (de aqui ) para checar se o primeiro frame é key-frame

ffprobe -show_frames -v quiet howimet2.ts | awk -F= '   /pict_type=/ { if (index($2, "I")) { i=1; } else { i=0; } } 
  /pkt_pts_time/ { if (i && ($2 >= 0)) print $2; }  
' | head -n 1

O resultado mostra que o primeiro quadro-chave não está localizado no segundo 0.

Eu acho que meu comando não está correto. o que estou perdendo?

    
por jackode 27.02.2013 / 05:01

3 respostas

3

Ao codificar o vídeo, o primeiro quadro tem como um quadro-chave. Será o primeiro totalmente codificado e os quadros subsequentes poderão utilizá-lo para previsão inter-frames. Além disso, no início da sequência de vídeo codificada, você terá uma unidade de acesso H.264 que informa ao decodificador a atualização.

Portanto, independentemente do que você esteja fazendo: a menos que você apenas copie o fluxo de bits, você estará recodificando o vídeo e seu primeiro quadro terá que ser um quadro-chave.

Agora, por qualquer motivo, seu fluxo tem um deslocamento em sua hora de início. Isso significa que todos os timestamps de apresentação também são deslocados de acordo com esse deslocamento. Se você inspecionar a cabeça da saída ffprobe -show_frames , verá que o quadro 0 será de fato um quadro-chave, mas com um PTS diferente.

Para compensar isso, você pode subtrair a hora de início de todos os PTS.

    
por 01.03.2013 / 10:04
0

Como mencionado, o primeiro quadro do seu vídeo deve ser um I-Frame. Seu problema não vem da codificação (ou copiar, se esse é o seu sabor), mas da decodificação. Ter -ss antes da entrada ser inexata, então o ffmpeg está fazendo o melhor possível para chegar até onde você queria. O Ffmpeg passou por esse local e, portanto, informa um primeiro timestamp diferente de zero.

Eu recomendaria tentar um segundo -s depois do seu -i. Ao longo das linhas -ss 299 -i input -ss 1.

Isso diz que você precisa da localização desejada e decodifica por 1 segundo antes do processamento. Não tenho certeza se isso consertará seu problema de pts, mas espero que isso o coloque na direção certa.

Para salientar, não acho que o comando force_key_frames esteja fazendo o que você acha que é. Se está fazendo alguma coisa, é provável que apenas diga para adicionar um quadro chave na saída a cada 300 segundos, mas isso é apenas um palpite. Significando que apenas o primeiro quadro de sua saída seria um quadro chave (t = 120).

link

    
por 15.06.2014 / 00:00
0

Defina o tamanho do GOP com "-g"

Só para demonstrar a precisão, aqui estão 1 segundo segmento

ffmpeg -i  in.mkv -g 30  -hls_time 1 -hls_list_size 0 index.m3u8

Veja como o m3u8 se parece:

    #EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:2
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:1.001000,
index0.ts
#EXTINF:1.001000,
index1.ts
#EXTINF:1.001000,
index2.ts
#EXTINF:1.001000,
index3.ts
#EXTINF:1.001000,
index4.ts
#EXTINF:1.001000,
index5.ts
#EXTINF:1.001000,
index6.ts
#EXTINF:1.001000,
index7.ts
#EXTINF:1.001000,
index8.ts
#EXTINF:1.001000,
index9.ts
#EXTINF:1.001000,
index10.ts
#EXTINF:1.001000,
index11.ts
#EXTINF:1.001000,
index12.ts
#EXTINF:1.001000,
index13.ts
#EXTINF:1.001000,
....
    
por 31.08.2016 / 22:49

Tags