¿Cómo verificar si un video está completamente descargado?

10

Tengo un montón de videos que quiero verificar si están completos o no. Algunos de ellos pueden descargarse parcialmente, pero no son defectuosos. ¿Cómo puedo verificar eficientemente si estos videos están completamente descargados?

Si tuviera los enlaces, habría verificado su tamaño, pero no los tengo.

Traté de usar ffprobey mediainfo. ffprobeinforma problemas menores en archivos descargados parcialmente, pero también informa problemas similares con algunos de los archivos descargados completamente. ¿Debo usar ffmpegpara leer los archivos completos y comparar la duración de los videos para verificar si se descargan? ¿Hay una mejor solución?

Ho1
fuente
¿Está hablando de archivos que se están descargando actualmente, es decir, el programa que los está descargando todavía está escribiendo en el archivo a medida que recibe más datos? ¿O estás hablando de archivos cuya descarga fue cancelada en algún momento en el pasado?
Gilles 'SO- deja de ser malvado'
@Gilles The se descargaron en el pasado, y ahora algunos de estos archivos están incompletos. Quiero encontrar archivos de video incompletos, para poder encontrar manualmente los enlaces y reanudar la descarga.
Ho1
@ Ho1 ¿mi respuesta satisfizo tu pregunta?
J363
@ J363 Gracias por su respuesta. ¿Podrías responder mi comentario?
Ho1

Respuestas:

11

ffmpeges una herramienta independiente del sistema operativo que es capaz de determinar si un archivo de video se ha descargado por completo. El siguiente comando le indica ffmpegque lea el video de entrada y codifique el video a nada. Durante el proceso de codificación, cualquier error, como la falta de cuadros, se envía a test.log.

ffmpeg -v error -i FILENAME.mp4 -f null - 2>test.log

Si un archivo de video no se descarga completamente, habrá muchas líneas en el archivo test.log. Por ejemplo, .1 MB faltantes en un archivo de video produjeron 71 líneas de errores. Si el video está completamente descargado y no se ha dañado, no se encuentran errores y no se imprimen líneas para test.log.


Editar

En el ejemplo que di arriba, probé todo el archivo porque el video de prueba que descargué era un torrent, que puede tener fragmentos faltantes en todo el archivo.

Agregar -sseof -60a la lista de argumentos verificará los últimos 60 segundos del archivo, que es considerablemente más rápido.

ffmpeg -v error -sseof -60 -i FILENAME.mp4 -f null - 2>test.log

Necesitará una versión más nueva de ffmpeg, a 2.8 le faltaba el indicador sseof, así que usé 3.0.

J363
fuente
1
Esto funciona de alguna manera, pero requiere procesar todo el video. Como método alternativo, descubrí que abrir el video en VLC, hacer clic en algún lugar cerca del final lleva menos tiempo y es más práctico. ¿Es posible definir algo similar en ffmpeg? Me refiero a buscar el 99% sin procesar todo el video y verificar si funciona bien sin errores.
Ho1
@ Ho1 ver el comando actualizado.
J363
1
Estoy seguro de que el comando funciona porque lo probé varias veces con y sin el indicador -sseof. El comando original verifica todo el archivo, que es el comportamiento sugerido. El comando modificado que solicitó afirma la suposición de que faltan datos desde el final del archivo en el comando, lo que puede no ser el caso. Mi archivo de prueba es el 99.9% de un mp4 de 137MB descargado con un cliente torrent. Cuando uso el indicador -sseof y aumento progresivamente la cantidad de tiempo que se ve hacia atrás, eventualmente obtengo el mismo resultado que si ejecutara el comando buscando en todo el archivo.
J363
1
Con -ssy -sseof, ffmpeg lee y procesa todo el archivo. Entonces, de todos modos, abrir el video en VLC y hacer clic cerca del final sería más rápido.
Ho1
1
Tienes razón, pero estoy descargando a través de http.
Ho1
7

MediaInfo muestra una línea:

Truncated: Yes

si un archivo no está completo como se esperaba por las especificaciones de formato.

Como técnicamente no hay diferencia entre un archivo incorrectamente (no cumple con las especificaciones sobre los límites del archivo) y archivos descargados parcialmente y descargados, es técnicamente imposible hacer la diferencia entre un archivo defectuoso y un archivo parcialmente descargado.

Se podría hacer otra prueba (avanzada), por ejemplo, leer el índice de un archivo .mp4 y verificar que el desplazamiento del archivo + tamaño de fotograma del último fotograma esté dentro del tamaño del archivo que obtiene, pero no es exactamente lo que está buscando. para (si hay metadatos, por ejemplo, pósters en el archivo fuente, al final del archivo, y el archivo se trunca justo antes de este póster, la descarga parcial todavía no se detecta en todos los casos). No está implementado en MediaInfo, pero puede agregar una solicitud de función de MediaInfo .

En todos los casos, es muy difícil detectar todas las descargas parciales, porque el tamaño total del archivo no está indicado en la mayoría de los formatos de archivos de video, por lo que puede estar seguro de que un archivo está truncado, pero no puede estar seguro de que un archivo no esté truncado. La única forma de asegurarse de haber descargado el archivo completo es obtener el tamaño del archivo en otro lugar (y mejor: tener su hash, por ejemplo, MD5).

PD: esta pregunta no es específica de ningún sistema operativo.

Jérôme Martinez
fuente
Gracias por tu respuesta. No quiero una respuesta exacta, una respuesta aproximada sería suficiente para mí. ¿Crees que esta pregunta debería trasladarse a superuser.com?
Ho1
No pude obtener ese campo incluso usando la versión mediainfo v0.7.83 usando -f(pantalla de información completa). ¿Podría por favor ayudarme a conseguir el Truncatedcampo?
Ho1
Simplemente elimine 1 byte en su archivo y debería mostrar este campo "truncado" (no necesita -f, la salida predeterminada es suficiente). Para su información, se implementa para los formatos más utilizados en la actualidad: MP4 / MOV, Matroska, MXF. ¿Estás probando con otro formato?
Jérôme Martinez
2
Muchas gracias por la respuesta. Para verificar muchos archivos a la vez, utilicé lo siguiente: mediainfo * | grep -E "^(IsTruncated|Complete name)"donde el nombre del archivo del archivo correspondiente se muestra directamente encima de la línea "IsTruncated: Yes".
0x01
4

Tenía un archivo donde ffmpeg (v3.1.1) con -sseof -60 no mostraba ninguna advertencia y acababa de salir sin ninguna indicación de que algo estaba mal. Mediainfo tampoco mostró que el archivo estaba truncado. Solo omitiendo -sseof -60 informaría cualquier error con ffmpeg. Así que volví a probar ffprobe. Parecía un poco más rápido que ffmpeg.

ffprobe -v error -count_frames -i filename.mp4

producido esta salida

[h264 @ 00000000004e6a60] Invalid NAL unit size.
[h264 @ 00000000004e6a60] Error splitting the input into NAL units.
[mov,mp4,m4a,3gp,3g2,mj2 @ 00000000004e5280] stream 1, offset 0x1350135: partial file

Todavía no encontré ningún falso positivo (según lo informado por el OP).

Editar : ffprobe estaba en mis archivos de prueba aproximadamente un 10% más rápido que ffmpeg, pero solo si le indica que use todos los núcleos con la opción '-threads 0'. De lo contrario, usa solo un núcleo / hilo y es más lento.

Jan Ehrhardt
fuente
Esto no proporciona una respuesta a la pregunta. Una vez que tenga suficiente reputación , podrá comentar cualquier publicación ; en su lugar, proporcione respuestas que no requieran una aclaración del autor de la pregunta . - De la opinión
Braiam
@Braiam Responde la pregunta, porque un archivo descargado por competencia no producirá ningún resultado y un archivo incompleto sí.
Jan Ehrhardt