Je dois lire un fichier volumineux contenant de nombreuses images d'animation à partir de CD/DVDrom et les afficher en tant qu'animations sur l'écran. Lors de la lecture à partir du disque dur, la stratégie consistant à lire une image en mémoire, à traiter, à afficher puis à lire l'image suivante fonctionne bien, mais lorsque je lis un périphérique optique, le temps d'accès tue l'animation. J'utilise C et winapi OpenFile/ReadFile méthodes. Comment dois-je lire le contenu d'un fichier stocké sur un périphérique optique pour obtenir une vitesse d'animation en temps réel (j'ai vu un programme qui le fait même en double vitesse, il ne sauvegarde pas tout le fichier avant le début de l'animation) ?Lecture rapide des données à partir du CD-ROM
Répondre
Deux techniques:
tampon LARGE ou cache, comme dans plusieurs MB. Le CD/DVD a des E/S séquentielles raisonnables mais des vitesses de recherche/accès très lentes (comme vous l'avez noté), il est donc rapide de recharger le tampon. Vous avez juste besoin que le tampon soit assez grand pour qu'il couvre quelques secondes pour permettre au disque de tourner si nécessaire, et chercher s'il est déjà lancé.
Multi-threading: conserve un thread continuellement en lecture et une animation distincte de décodage du thread. Le fil du lecteur devrait bloquer s'il est trop éloigné du décodage.
Ces techniques s'appliquent à n'importe quel langage de programmation et peuvent être combinées pour un effet optimal. Un tampon de lecture et un tampon de trame décodé vous protègent deux fois également contre le temps de décodage et le temps d'accès.
EDIT: Voici les techniques utilisées par MPlayer. En outre, vous devriez tenir compte de votre format d'encodage si vous le pouvez - différents formats peuvent réduire le temps processeur lors du décodage pour moins de données à lire sur le disque. Quelques informations pour estimer la quantité de vidéo à compresser.
- Vitesse de lecture pour 1x CD-ROM: 150 Kio/s (vitesse minimum)
- Vitesse de lecture 4x CD-ROM: 600 Kio/s (commande minimum standard)
- Vitesse de lecture 16x CD- ROM: 1600 kiB/s (maximum pouvant être obtenu, n'excède généralement pas 8x)
- Vitesse de lecture 1x Lecteur DVD: ~ 1,3 Mio/s
- Vidéo en définition standard compressée avec MPEG2 en qualité DVD: ~ 600 kiB/s
- Vidéo en définition standard compressée avec MPEG4 en qualité DVD: ~ 100 kiB/s
- non compressé définition standard vidéo: ~ 30 MB/s
- image de 1000x1000 standard (1 mégapixels) à la couleur de 24 bits: 3 MB
- standard 1 mégapixels image au couleur de 8 bits (niveaux de gris): 1 MB
Edit2: plus d'infos
- de noter que les DVD peuvent généralement être lu à 8x ou si votre lecteur prend en charge (la plupart font maintenant).
- Les animations commencent à apparaître lisses à plus de 24 images/seconde. En dessous, ils apparaîtront saccadés pour un spectateur.
- La compression sans perte est généralement bonne pour une réduction d'environ 50% de la taille des images photographiques. Votre kilométrage peut varier.
- La lecture fluide des animations dépend en partie de la manière dont vous parlez au matériel vidéo. Certaines méthodes produiront de meilleurs résultats que d'autres. Je vous suggère fortement de regarder le code pour MPlayer dans ce cas.
Est-ce que les données doivent être lues dans certains blocs de données définis, ou si le chevauchement io est une meilleure idée? – bartek
@bartek: les E/S chevauchantes contournent le cache système, de sorte qu'il sera (probablement) _smoother_ mais pas nécessairement plus rapide. –
Merci beaucoup, je suis vraiment utile. Je ne suis pas sûr de comprendre ce que signifie "lecture continue", est-ce que cela fait une différence si j'appelle ReadFile plusieurs fois avec read_buffer plus petit ou moins avec un buffer plus grand? J'ai trouvé que l'utilisation de std :: fstream semble utiliser un disque plus lisse, peut-il être vrai? – bartek
Une chose à essayer est la compression. Le chargement d'un fichier zip sur le lecteur, par exemple, prendra moins de temps, mais nécessitera plus de temps CPU pour le traitement. Si la compression sans perte est possible, cela peut valoir la peine d'être inspecté. Comprendre un lecteur de CD est utile aussi. L'entraînement tourne à une vitesse de rotation fixe. Cela signifie que les données sur le en dehors du du disque se chargent plus rapidement que les données à l'intérieur. Un graveur, cependant, va graver des données de l'intérieur vers l'extérieur de sorte que vous risquez de devoir graver beaucoup de données avant l '«animation» pour obtenir la vitesse de lecture maximale.
Ceci est un bon conseil (et s'applique aussi aux disques durs), mais si je lis bien, le questionneur n'a pas beaucoup de contrôle sur le placement de données sur disque ou le format d'animation. Je pense que ce ne serait pas une mauvaise idée de mentionner les vitesses de lecture pour les lecteurs optiques par rapport aux débits standard pour les formats vidéo compressés. – BobMcGee
pour être plus précis, je lis un dicom (format d'image médicale), les données dans les images multitrames sont toujours stockées image par image dans un seul segment de données, parfois il est codé sans perte. – bartek
Pouvez-vous l'encoder avec perte? Pouvez-vous le placer où vous voulez sur le disque? – Goz
utilisation CreateFile avec OPEN_ALWAYS et FILE_FLAG_SEQUENTIAL_SCAN
DICOM est un format vraiment complexe ... en fonction de ce que les options de résolution et de compression sont, vous ne pouvez pas être en mesure de lire assez rapide à partir d'un CD pour jouer dans réel temps. Dans ce cas, vous devez choisir entre la lecture au ralenti et la saccade. Les DVD ne devraient pas poser de problème - voir le tableau sur les vitesses et débits relatifs. – BobMcGee