Defina a taxa na qual AVSampleBufferDisplayLayer renderiza buffers de amostra

Estou usando um AVSampleBufferDisplayLayer para exibir CMSampleBuffers que estão vindo por uma conexão de rede no formato h.264. A reprodução de vídeo é suave e está funcionando corretamente, no entanto, não consigo controlar a taxa de quadros. Especificamente, se enfileirar 60 quadros por segundo no AVSampleBufferDisplayLayer, ele exibirá esses 60 quadros, mesmo que o vídeo esteja sendo gravado a 30 FPS.

Ao criar buffers de amostra, é possível definir o registro de data e hora da apresentação passando uma matriz de informações de tempo para CMSampleBufferCreate (as informações de tempo não estão presentes no fluxo h.264, mas podem ser calculadas ou transmitidas em um formato de contêiner). Os carimbos de hora da apresentação que defini têm cerca de 0,033 segundos de distância e a duração é de 0,033, mas a camada de exibição ainda exibe o maior número possível de quadros por segundo.

Há duas maneiras de enfileirar os buffers no AVSampleBufferDisplayLayer: "restrito" chamando - [AVSampleBufferDisplayLayer enqueueSampleBuffer:] sempre que um buffer estiver pronto ou "irrestrito" chamando - [AVSampleBufferDisplayLayer requestMediaDataWhenReaduingOnlyue: Eu tentei os dois, mas mesmo o segundo método exibe os buffers o mais rápido possível - por exemplo, se eu tiver 300 quadros na fila do lado receptor, na primeira vez em que o bloco no método acima for executado, readyForMoreMediaData permanece verdadeiro, não importa quantos os buffers são enfileirados e todos são exibidos em um tempo muito curto.

Esse comportamento é semelhante ao que seria de esperar se o anexo kCMSampleAttachmentKey_DisplayImediatamente fosse definido no CMSampleBuffer, no entanto, isso NÃO está definido no momento (e o padrão é falso).

Tentei definir as camadas controlTimeBase, mas não pareceu ter nenhum efeito. Estou sem muitas outras coisas para tentar e não consegui encontrar exemplos online. Alguém sabe como controlar a taxa de quadros na qual AVSampleBufferDisplayLayer exibe quadros?

questionAnswers(2)

yourAnswerToTheQuestion