Haga que el archivo MKV sea adecuado para la transmisión con ffmpeg (o avconv): ¿cómo mover todos los metadatos al principio del archivo?

Haga que el archivo MKV sea adecuado para la transmisión con ffmpeg (o avconv): ¿cómo mover todos los metadatos al principio del archivo?

Mi pregunta creo que es bastante simple...

A veces me gusta descargar archivos MKV grandes desde mi servidor web y reproducirlos mientras se descargan. Sin embargo, si hago esto en archivos MKV que he transcodificado, a menudo el archivo mostrará que es mucho más corto de lo que realmente es, y después de llegar al final seguirá reproduciéndose y mostrará una hora incorrecta... por ejemplo Mostrará 2:50/2:50 pero seguirá reproduciendo; sin embargo, si intento buscar hacia atrás con las teclas de flecha, el reproductor fallará o retrocederá al principio del archivo.

Entonces, ¿cómo puedo mover todos los metadatos al principio del archivo mientras codifico para que el reproductor sepa cuánto dura el archivo sin tenerlo completo?Puedes hacer esto con el mp4formato usando-movflags faststart, pero ¿cómo hacerlo mkv?

Lo siento si esto ya se preguntó y respondió en otro lugar, no pude pensar en mejores palabras clave que las que usé y las que usé no produjeron resultados.

Respuesta1

La fundación Matroska ofrece una herramienta,mklimpio, que realiza una tarea similar a la que hace qt-faststart para MOV/MP4.

Sintaxis:

mkclean in.mkv out.mkv

Esto regenerará el índice de cues. Para mantener las señales originales,

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

FFmpeg también puede hacereste, con algunas conjeturas por parte del usuario.

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

donde el reserve_index_spacevalor en bytes es el tamaño necesario para el índice. 50kbytes es el tamaño sugerido para 1 hora de medios.

Respuesta2

Construyendo encima deLa respuesta de Gyan., mkclean es la herramienta adecuada para optimizar MKV para transmisión. Sin embargo, noté algunas peculiaridades en cómo mkclean producía archivos, así que hice una bifurcación:https://github.com/XMB5/mkclean-pragmatic

Uso de ejemplo:mkclean test.mkv test_streaming_optimized.mkv

Aquí hay algunos extractos del archivo Léame:

Antecedentes (por qué necesitamos mkclean en primer lugar)

Para poder transmitir archivos mkv, el reproductor de vídeo necesita leer elelemento de señales, una parte del archivo que asigna marcas de tiempo de vídeo a desplazamientos de bytes. Estas compensaciones permiten que el reproductor de video busque marcas de tiempo a lo largo del video, sin adivinar la ubicación del byte en el archivo.

Normalmente, el elemento cues se encuentra al final de un archivo matroska (verdiagrama de estructura matroska). Esto se debe a que la aplicación que crea el mkv escribe todos los datos del vídeo primero y sólo después puede conocer las ubicaciones exactas de los bytes del contenido del vídeo.

Sin embargo, tener el elemento cues al final del archivo no es lo ideal: el reproductor de video debe leer el encabezado de búsqueda al inicio del archivo, luego buscar el final del archivo para leer la información de las cues y luego buscar hacia atrás para leer. el contenido del vídeo. Con la transmisión HTTP, esto equivale a 3 solicitudes separadas, lo que agrega unos segundos de retraso en comparación con 1 solicitud.

mkcleanreestructura un archivo mkv para que el elemento cues esté al principio, lo que permite que el vídeo comience a reproducirse antes.

Cambios técnicos en la horquilla (respecto al mkclean original)

  • Establecer la versión de tipo de documento matroska v4por defecto
    • Establezca la versión de lectura del documento en 2 (por compatibilidad; de lo contrario, no funcionará con vlc, mpv, ffmpeg, etc.)
  • Deshabilite las optimizaciones de forma predeterminada (equivalente al --no-optimizeindicador mkclean normal)
  • Ignorar cuando las marcas de tiempo del clúster no van en orden cronológico
    • El cambio forzado de las marcas de tiempo hace que mpv advierta "Marca de tiempo de video no válida: 10.085000 -> 10.060000"

información relacionada