%3A%20%C2%BFc%C3%B3mo%20mover%20todos%20los%20metadatos%20al%20principio%20del%20archivo%3F.png)
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 mp4
formato 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_space
valor en bytes es el tamaño necesario para el índice. 50k
bytes 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.
mkclean
reestructura 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 v4
por 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-optimize
indicador 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"