2016-02-27 6 views
2

J'écris un serveur dans golang et je l'ai eu pour servir un fichier .mp4 de base. Il le sert par octets. Le problème est que je ne peux pas chercher/ignorer la vidéo. J'ai essayé la recherche à travers le flux stackover et Google pour trouver une réponse, mais je suis venu court ..GoLang - Recherche à travers une vidéo (servant d'octets)

Voici mon code:

package main 

import (
    "net/http" 
    "io/ioutil" 
    "fmt" 
    "os" 
    "log" 
    "bytes" 
) 

func ServeHTTP(w http.ResponseWriter, r *http.Request) { 
      // grab the generated receipt.pdf file and stream it to browser 
      streamPDFbytes, err := ioutil.ReadFile("./video.mp4") 
      log.Println(r) 
      if err != nil { 
        fmt.Println(err) 
        os.Exit(1) 
      } 

      b := bytes.NewBuffer(streamPDFbytes) 

      // stream straight to client(browser) 
      w.Header().Set("Content-type", "video/mp4") 

      if _, err := b.WriteTo(w); err != nil { // <----- here! 
        fmt.Fprintf(w, "%s", err) 
      } 

      w.Write([]byte("Video Completed")) 
} 

func main() { 
    http.Handle("/", new(MyHandler)) 
    http.ListenAndServe(":8080", nil) 
} 

Quelqu'un at-il la réponse à la façon dont la recherche fonctionne à golang?

Merci, Passez une bonne journée!

Répondre

5

La façon la plus simple pour diffuser la vidéo MP4 sur Go avec le soutien à la recherche est

package main 

import (
    "net/http" 
) 

func main() { 
    fs := http.FileServer(http.Dir(".")) 
    http.Handle("/", http.StripPrefix("/", fs)) 
    http.ListenAndServe(":8080", nil) 
} 

et vidéo sera disponible à http://localhost:8080/video.mp4

Plus complexe est

package main 

import (
    "log" 
    "net/http" 
    "os" 
    "time" 
) 

func ServeHTTP(w http.ResponseWriter, r *http.Request) { 
    video, err := os.Open("./video.mp4") 
    if err != nil { 
     log.Fatal(err) 
    } 
    defer video.Close() 

    http.ServeContent(w, r, "video.mp4", time.Now(), video) 
} 

func main() { 
    http.HandleFunc("/", ServeHTTP) 
    http.ListenAndServe(":8080", nil) 
} 

Si vous avez besoin quelque chose de plus flexible, vous devez implémenter votre propre serveur progressive streaming. Dans votre code vous avez oublié d'ajouter et de traiter Range/Accept-Range les en-têtes c'est pourquoi ni FF, ni Chrome ne vous montre pas la barre de recherche mais de toute façon je ne pense pas que garder tout le fichier MP4 en mémoire est une bonne idée.