Maison >développement back-end >Golang >Différence entre le flux de sortie de la console et le flux de fichiers multimédias

Différence entre le flux de sortie de la console et le flux de fichiers multimédias

WBOY
WBOYavant
2024-02-08 23:15:09538parcourir

Différence entre le flux de sortie de la console et le flux de fichiers multimédias

La différence entre le flux de sortie de la console et le flux de fichiers multimédias est un concept important dans le développement de programmes. Le flux de sortie de la console est principalement utilisé pour générer des informations pendant l'exécution du programme sur la console afin de permettre aux développeurs de déboguer et d'afficher les résultats en cours d'exécution. Le flux de fichiers multimédias est utilisé pour lire et écrire des fichiers multimédias, tels que l'audio, la vidéo, etc. Il existe certaines différences dans les scénarios d'utilisation, de traitement des données et d'application entre les deux. Il est très important que les développeurs comprennent et maîtrisent ces différences. Nous explorerons ensuite en détail les différences et les conseils d’utilisation entre les deux.

Contenu de la question

J'ai du mal à essayer de restituer un GIF dans Go. Le fichier GIF de sortie ne peut pas être ouvert à l'aide d'une méthode, mais peut être ouvert normalement à l'aide d'une autre méthode. J'ai trouvé Rendering .gif dans Go mais cela n'a pas résolu mon problème spécifique.

Voici le code en question :

package main

import (
    "bufio"
    "fmt"
    "image"
    "image/color"
    "image/gif"
    "io"
    "math"
    "math/rand"
    "os"
    "time"
)

var palette = []color.Color{color.White, color.Black}

const (
    whiteIndex = 0
    blackIndex = 1
)

func main() {
    w := bufio.NewWriter(os.Stdout)
    lissajous(w)
}

func lissajous(out io.Writer) {
    const (
        cycles  = 5
        res     = 0.001
        size    = 100
        nframes = 64
        delay   = 8
    )
    rand.Seed(time.Now().UTC().UnixNano())

    freq := rand.Float64() * 3.0
    anim := gif.GIF{LoopCount: nframes}
    phase := 0.0

    for i := 0; i < nframes; i++ {
        rect := image.Rect(0, 0, 2 * size+1, 2 * size + 1)
        img := image.NewPaletted(rect, palette)

        for t := 0.0; t < cycles * 2 * math.Pi; t += res {
            x := math.Sin(t)
            y := math.Sin(t * freq + phase)
            img.SetColorIndex(size + int(x * size + 0.5), size + int(y * size + 0.5), blackIndex)
        }
        phase += 0.1
        anim.Delay = append(anim.Delay, delay)
        anim.Image = append(anim.Image, img)
    }
    err := gif.EncodeAll(out, &anim)
    if err != nil {
        return
    } else {
        fmt.Println(err)
    }
}

Voici les commandes :

go build main.go
main > out.gif

Ensuite, out.gif ne peut pas être ouvert. Mais cette méthode fonctionne très bien :

func main() {
    fileName := "out.gif"
    f, err3 := os.Create(fileName)
    if err3 != nil {
        fmt.Println("create file fail")
    }
    w := bufio.NewWriter(f) 
    lissajous(w)
    w.Flush()
    f.Close()

}

Je ne comprends pas pourquoi la première méthode ne crée pas un fichier GIF fonctionnel, alors que la deuxième méthode le fait. Est-ce lié à la façon dont Go gère l'écriture ou la mise en mémoire tampon des fichiers ?

Solution de contournement

Selon @CeriseLimón Remarque  :

func main() {
    w := bufio.NewWriter(os.Stdout)
    lissajous(w)
    w.Flush()
}

Expliquez la dernière question

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer