Torne o arquivo MKV adequado para streaming com ffmpeg (ou avconv) - como mover todos os metadados para o início do arquivo?

Torne o arquivo MKV adequado para streaming com ffmpeg (ou avconv) - como mover todos os metadados para o início do arquivo?

Minha pergunta, eu acho, é bem simples...

Às vezes gosto de baixar arquivos MKV grandes de um servidor web meu e reproduzi-los durante o download. No entanto, se eu fizer isso em arquivos MKV que transcodifiquei, muitas vezes o arquivo mostrará que é muito mais curto do que realmente é e, depois de chegar ao fim, ele continuará reproduzindo e exibirá um horário incorreto... por exemplo ele exibirá 2:50/2:50, mas continuará jogando; no entanto, se eu tentar retroceder com as teclas de seta, o player irá travar ou voltar ao início do arquivo.

Então, como posso mover todos os metadados para o início do arquivo durante a codificação, para que o player saiba quanto tempo o arquivo tem sem ter tudo?Você pode fazer isso com o mp4formato usando-movflags faststart, mas como fazer isso mkv?

Sinto muito se isso já foi perguntado e respondido em outro lugar, não consegui pensar em palavras-chave melhores do que as que usei e as que usei não produziram resultados.

Responder1

A fundação Matroska oferece uma ferramenta,mkclean, que executa uma tarefa semelhante ao que qt-faststart faz para MOV/MP4s.

Sintaxe:

mkclean in.mkv out.mkv

Isso irá regenerar o índice de dicas. Para manter as sugestões originais,

mkclean --keep-cues in.mkv out.mkv

FFmpeg também pode fazeresse, com algumas suposições, por parte do usuário.

ffmpeg -i in.mkv -c copy -reserve_index_space 50k out.mkv 

onde o reserve_index_spacevalor em bytes é o tamanho necessário para o índice. 50kbytes é o tamanho sugerido para 1 hora de mídia.

Responder2

Construindo em cimaA resposta de Gyan, mkclean é a ferramenta certa para otimizar MKVs para streaming. No entanto, notei algumas peculiaridades na forma como o mkclean produzia arquivos, então fiz um fork:https://github.com/XMB5/mkclean-pragmatic

Exemplo de uso:mkclean test.mkv test_streaming_optimized.mkv

Aqui estão alguns trechos do leia-me:

Antecedentes (por que precisamos do mkclean em primeiro lugar)

Para transmitir arquivos mkv, o player de vídeo precisa ler oelemento de dicas, uma parte do arquivo que mapeia carimbos de data/hora de vídeo para deslocamentos de bytes. Essas compensações permitem que o player de vídeo busque carimbos de data/hora em todo o vídeo, sem adivinhar a localização do byte no arquivo.

Normalmente, o elemento cues está localizado no final de um arquivo matroska (vejadiagrama de estrutura matroska). Isso ocorre porque o aplicativo que cria o mkv grava todos os dados de vídeo primeiro e só depois pode saber a localização exata dos bytes do conteúdo do vídeo.

No entanto, ter o elemento de dicas no final do arquivo não é o ideal: o reprodutor de vídeo deve ler o cabeçalho de busca no início do arquivo, depois buscar o final do arquivo para ler as informações das dicas e, em seguida, buscar novamente para ler. o conteúdo do vídeo. Com o streaming HTTP, isso equivale a três solicitações separadas, que adicionam alguns segundos de atraso em comparação com uma solicitação.

mkcleanreestrutura um arquivo mkv para que o elemento cues esteja no início, permitindo que o vídeo comece a ser reproduzido mais cedo.

Mudanças técnicas no fork (em comparação com o mkclean original)

  • Defina a versão doctype como matroska v4padrão
    • Defina a versão de leitura do documento como 2 (para compatibilidade, caso contrário não funcionará com vlc, mpv, ffmpeg, etc.)
  • Desativar otimizações por padrão (equivalente ao --no-optimizesinalizador mkclean normal)
  • Ignorar quando os carimbos de data/hora do cluster não seguem em ordem cronológica
    • A alteração forçada dos carimbos de data e hora faz com que o mpv avise "Carimbo de data e hora de vídeo inválido: 10.085000 -> 10.060000"

informação relacionada