Domanda

Devo leggere un file di grandi dimensioni contenente molti fotogrammi di animazione da CD/DVD-rom e visualizzarlo sullo schermo come animazione.Durante la lettura dal disco rigido, la strategia di leggere un fotogramma in memoria, elaborarlo, visualizzarlo e quindi leggere il fotogramma successivo funziona bene, ma quando leggo dal dispositivo ottico, il tempo di accesso uccide l'animazione.

Utilizzo i metodi C e winapi OpenFile/ReadFile.

Come dovrei leggere il contenuto di un file memorizzato su un dispositivo ottico per ottenere una velocità di animazione in tempo reale (ho visto un programma che lo fa anche a doppia velocità, di sicuro non memorizza nel buffer l'intero file prima dell'inizio dell'animazione)?

È stato utile?

Soluzione

Due tecniche:

  1. Buffer o cache GRANDE, come in più MB.Il CD/DVD ha un I/O sequenziale ragionevole ma velocità di ricerca/accesso molto lente (come hai notato), quindi è veloce riempire il buffer.Hai solo bisogno che il buffer sia abbastanza grande da coprire alcuni secondi per consentire al disco di avviarsi se necessario e cercare se è già avviato.

  2. Multithreading:mantenere un thread in lettura continua e un'animazione di decodifica del thread separata.Il thread del lettore dovrebbe bloccarsi se avanza troppo avanti rispetto alla decodifica.

Queste tecniche si applicano a qualsiasi linguaggio di programmazione e possono essere combinate per ottenere i migliori risultati.Un buffer di lettura e un frame buffer decodificato vi proteggono doppiamente dal tempo di decodifica e dal tempo di accesso.

MODIFICARE:Queste sono le tecniche utilizzate da MPlayer.Inoltre, se possibile, dovresti considerare il formato di codifica: formati diversi possono ridurre il tempo della CPU durante la decodifica con meno dati da leggere dal disco.Un paio di informazioni per stimare la quantità di video da comprimere.

  • Velocità di lettura per 1x CD-ROM:150 kiB/s (velocità minima)
  • Velocità di lettura 4x CD-ROM:600 kiB/s (unità minima standard)
  • Velocità di lettura 16x CD-ROM:1600 kiB/s (massimo ottenibile, di solito funziona solo fino a 8x)
  • Velocità di lettura 1 unità DVD:~1,3 MiB/s
  • Video a definizione standard compresso con MPEG2 in qualità DVD:~600 kB/s
  • Video a definizione standard compresso con MPEG4 in qualità DVD:~100 kB/s
  • Video a definizione standard non compresso:~30MB/sec
  • Immagine standard 1000x1000 (1 megapixel) a colori a 24 bit:3 MB
  • Immagine standard da 1 megapixel a colori a 8 bit (scala di grigi):1MB

Modifica2:informazioni addizionali

  • Tieni presente che i DVD comunemente possono essere letti a 8x circa se l'unità lo supporta (la maggior parte lo fa ora).
  • Le animazioni iniziano ad apparire fluide a 24+ fotogrammi/secondo.Di seguito appariranno a scatti allo spettatore.
  • La compressione senza perdite è solitamente buona per una riduzione delle dimensioni di circa il 50% per le immagini fotografiche.Il tuo chilometraggio può tuttavia variare.
  • La riproduzione fluida delle animazioni dipenderà in parte da come parli con l'hardware video.Alcuni metodi produrranno risultati migliori di altri.Ti consiglio ALTAMENTE di dare un'occhiata al codice di MPlayer in questo caso.

Altri suggerimenti

Una cosa da provare è la compressione. Il caricamento di un file zip dall'unità, ad esempio, richiederà meno tempo ma richiederà più tempo di CPU per elaborare. Se la compressione senza perdita è possibile, ciò potrebbe valere la pena ispezionare. Anche capire un'unità CD è utile. L'unità gira a una velocità di rotazione fissa. Ciò significa che i dati sul file fuori del disco si carica più velocemente dei dati all'interno. Un bruciatore, tuttavia, brucerà i dati dall'interno verso l'esterno, quindi potresti finire per bruciare molti dati prima dell'animazione per ottenere una velocità di lettura massima.

uso Createfile con open_always e file_flag_sequential_scan

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top