Comment vérifier si une vidéo est complètement téléchargée?

10

J'ai un tas de vidéos que je veux vérifier si elles sont complètes ou non. Certains d'entre eux peuvent être téléchargés partiellement, mais ils ne sont pas défectueux. Comment puis-je vérifier efficacement si ces vidéos sont complètement téléchargées?

Si j'avais eu les liens, j'aurais vérifié leur taille, mais je n'en ai pas.

J'ai essayé d'utiliser ffprobeet mediainfo. ffprobesignale des problèmes mineurs sur des fichiers partiellement téléchargés, mais il signale également des problèmes similaires avec certains des fichiers complètement téléchargés. Dois-je utiliser ffmpegpour lire les fichiers entiers et comparer la longueur des vidéos pour vérifier si elles sont téléchargées? Y a-t-il une meilleure solution?

Ho1
la source
Parlez-vous de fichiers en cours de téléchargement, c'est-à-dire que le programme qui les télécharge écrit toujours dans le fichier car il reçoit plus de données? Ou parlez-vous de fichiers dont le téléchargement a été abandonné à un moment donné dans le passé?
Gilles 'SO- arrête d'être méchant'
@Gilles Les sont téléchargés dans le passé, et maintenant certains de ces fichiers sont incomplets. Je souhaite rechercher des fichiers vidéo incomplets, afin de pouvoir rechercher manuellement les liens et reprendre le téléchargement.
Ho1
@ Ho1 ma réponse at-elle satisfait votre question?
J363
@ J363 Merci pour votre réponse. Pourriez-vous s'il vous plaît répondre à mon commentaire?
Ho1

Réponses:

11

ffmpegest un outil indépendant du système d'exploitation qui est capable de déterminer si un fichier vidéo a été complètement téléchargé. La commande ci-dessous indique ffmpegde lire la vidéo d'entrée et de coder la vidéo pour rien. Pendant le processus d'encodage, toutes les erreurs telles que les trames manquantes sont sorties dans test.log.

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

Si un fichier vidéo n'est pas totalement téléchargé, le fichier test.log comportera de nombreuses lignes. Par exemple, 0,1 Mo manquant dans un fichier vidéo a produit 71 lignes d'erreurs. Si la vidéo est entièrement téléchargée et n'a pas été corrompue, aucune erreur n'est trouvée et aucune ligne n'est imprimée dans test.log.


Éditer

Dans l'exemple que j'ai donné ci-dessus, j'ai testé l'intégralité du fichier car la vidéo de test que j'ai téléchargée était un torrent, qui peut avoir des morceaux manquants dans le fichier.

L'ajout -sseof -60à la liste d'arguments vérifiera les 60 dernières secondes du fichier, ce qui est considérablement plus rapide.

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

Vous aurez besoin d'une version plus récente de ffmpeg, il manquait le drapeau sseof à 2.8, j'ai donc utilisé 3.0.

J363
la source
1
Cela fonctionne d'une manière ou d'une autre, mais cela nécessite de traiter toute la vidéo. Comme méthode alternative, j'ai trouvé que l'ouverture de la vidéo dans VLC, cliquer quelque part près de la fin prend moins de temps et est plus pratique. Est-il possible de définir une chose similaire dans ffmpeg? Je veux dire chercher à 99% sans traiter toute la vidéo et vérifier si cela fonctionne bien sans erreur.
Ho1
@ Ho1 voir la commande mise à jour.
J363
1
Je suis certain que la commande fonctionne car je l'ai testée plusieurs fois avec et sans l'indicateur -sseof. La commande d'origine vérifie l'ensemble du fichier, ce qui est le comportement suggéré. La commande modifiée que vous avez demandée suppose que des données manquent à la fin du fichier dans la commande, ce qui n'est peut-être pas le cas. Mon fichier de test représente 99,9% d'un mp4 de 137 Mo téléchargé avec un client torrent. Lorsque j'utilise l'indicateur -sseof et que j'augmente progressivement la durée pendant laquelle il regarde en arrière, j'obtiens finalement la même sortie exacte que si j'exécutais la commande en recherchant l'ensemble du fichier.
J363
1
Avec -sset -sseof, ffmpeg lit et traite tout le fichier. Donc, de toute façon, ouvrir la vidéo dans VLC et cliquer près de la fin serait plus rapide.
Ho1
1
Vous avez raison, mais je télécharge sur http.
Ho1
7

MediaInfo affiche une ligne:

Truncated: Yes

si un fichier n'est pas complet comme prévu par les spécifications de format.

Comme il n'y a techniquement aucune différence entre un fichier mal (ne répondant pas aux spécifications concernant les limites de fichier) les fichiers multiplexés et partiellement téléchargés, il est techniquement impossible de faire la différence entre un fichier bogué et un fichier partiellement téléchargé.

Un autre test (avancé) pourrait être effectué, par exemple en lisant l'index d'un fichier .mp4 et en vérifiant que le décalage de fichier + la taille de la dernière image correspond à la taille du fichier que vous obtenez, mais ce n'est pas exactement ce que vous recherchez. pour (s'il y a des métadonnées, par exemple des affiches dans le fichier source, à la fin du fichier, et que le fichier est tronqué juste avant cette affiche, le téléchargement partiel n'est toujours pas détecté dans tous les cas). Il n'est pas implémenté dans MediaInfo mais vous pouvez ajouter une demande de fonctionnalité MediaInfo .

Dans tous les cas, il est très difficile de détecter tous les téléchargements partiels, car la taille totale du fichier n'est pas indiquée dans la plupart des formats de fichiers vidéo, vous pouvez donc être sûr qu'un fichier est tronqué, mais vous ne pouvez pas être sûr qu'un fichier n'est pas tronqué. La seule façon de vous assurer que vous avez téléchargé le fichier complet est d'obtenir la taille du fichier ailleurs (et mieux: avoir son hachage, par exemple MD5).

PS: cette question n'est spécifique à aucun système d'exploitation.

Jérôme Martinez
la source
Merci pour votre réponse. Je ne veux pas de réponse exacte, une réponse approximative me suffirait. Pensez-vous que cette question devrait être déplacée vers superuser.com?
Ho1
Je n'ai pas pu obtenir un tel champ même en utilisant la version v0.7.83 de mediainfo en utilisant -f(affichage complet des informations). Pourriez-vous s'il vous plaît aider à obtenir le Truncatedchamp?
Ho1
Supprimez simplement 1 octet dans votre fichier et vous devriez avoir ce champ "tronqué" affiché (pas besoin de -f, la sortie par défaut est suffisante). Pour info, il est implémenté pour les formats les plus utilisés aujourd'hui: MP4 / MOV, Matroska, MXF. testez-vous avec un autre format?
Jérôme Martinez
2
Merci beaucoup pour la réponse. Pour vérifier plusieurs fichiers à la fois, j'ai utilisé ce qui suit: mediainfo * | grep -E "^(IsTruncated|Complete name)"où le nom de fichier du fichier correspondant est affiché directement au-dessus de la ligne "IsTruncated: Yes".
0x01
4

J'avais un fichier où ffmpeg (v3.1.1) avec -sseof -60 n'affichait aucun avertissement et venait de se terminer sans aucune indication que quelque chose n'allait pas. Mediainfo n'a pas non plus montré que le fichier était tronqué. Seule la suppression de -sseof -60 signale toute erreur avec ffmpeg. J'ai donc recommencé à essayer ffprobe. Il semblait légèrement plus rapide que ffmpeg.

ffprobe -v error -count_frames -i filename.mp4

produit cette sortie

[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

Je n'ai pas encore rencontré de faux positifs (comme rapporté par l'OP).

Edit : ffprobe était sur mes fichiers de test environ 10% plus rapide que ffmpeg, mais seulement si vous lui demandez d'utiliser tous les cœurs avec l'option '-threads 0'. Sinon, il n'utilise qu'un seul noyau / fil et est plus lent.

Jan Ehrhardt
la source
Cela ne fournit pas de réponse à la question. Une fois que vous avez une réputation suffisante, vous pourrez commenter n'importe quel message ; fournissez plutôt des réponses qui ne nécessitent pas de clarification de la part du demandeur . - De l'avis
Braiam
@Braiam Il répond à la question, car un fichier téléchargé complet ne produira aucune sortie et un fichier incomplet le fera.
Jan Ehrhardt