diff --git a/Software/Development/Language/Go/Demo/Golang_实现_MP4_视频文件服务器.md b/Software/Development/Language/Go/Demo/Golang_实现_MP4_视频文件服务器.md new file mode 100644 index 0000000..46c9d83 --- /dev/null +++ b/Software/Development/Language/Go/Demo/Golang_实现_MP4_视频文件服务器.md @@ -0,0 +1,120 @@ +# Golang 实现 MP4 视频文件服务器 + +生命不止,继续 go go go !!! + +有点忙,有点懈怠,继续。 + +关于golang实现的静态文件服务器之前有写过: + +[Go实战–golang实现静态文件服务器(文件查看,文件上传,文件下载)](http://blog.csdn.net/wangshubo1989/article/details/77319537?locationNum=10&fps=1) + +正好,最近在做视频方面的东西,那么先来个简单的,实现一个提供mp4视频文件的服务器吧,并且通过浏览器访问播放。 + +## MP4 文件服务器 + +```go +package main + +import ( + "log" + "net/http" + "os" + "time" +) + +func ServeHTTP(w http.ResponseWriter, r *http.Request) { + video, err := os.Open("./test.mp4") + if err != nil { + log.Fatal(err) + } + defer video.Close() + + http.ServeContent(w, r, "test.mp4", time.Now(), video) +} + +func main() { + http.HandleFunc("/", ServeHTTP) + http.ListenAndServe(":8080", nil) +} +``` + +```go +package main + +import "io/ioutil" +import "log" +import "net/http" +import "strings" + +type viewHandler struct{} + +func (vh *viewHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + path := r.URL.Path[1:] + + data, err := ioutil.ReadFile(string(path)) + + if err != nil { + log.Printf("Error with path %s: %v", path, err) + w.WriteHeader(404) + w.Write([]byte("404")) + } + + if strings.HasSuffix(path, ".html") { + w.Header().Add("Content-Type", "text/html") + } else if strings.HasSuffix(path, ".mp4") { + w.Header().Add("Content-Type", "video/mp4") + } + + w.Write(data) +} + +func main() { + http.Handle("/", new(viewHandler)) + http.ListenAndServe(":8080", nil) +} +``` + +## nareix/joy4 + +Golang audio/video library and streaming server + +我们先浅尝辄止,简单使用一下: + +```go +package main + +import ( + "fmt" + + "github.com/nareix/joy4/av" + "github.com/nareix/joy4/av/avutil" + "github.com/nareix/joy4/format" +) + +func init() { + format.RegisterAll() +} + +func main() { + file, _ := avutil.Open("test.mp4") + streams, _ := file.Streams() + for _, stream := range streams { + if stream.Type().IsAudio() { + astream := stream.(av.AudioCodecData) + fmt.Println(astream.Type(), astream.SampleRate(), astream.SampleFormat(), astream.ChannelLayout()) + } else if stream.Type().IsVideo() { + vstream := stream.(av.VideoCodecData) + fmt.Println(vstream.Type(), vstream.Width(), vstream.Height()) + } + } + + file.Close() +} +``` + +以上程序输出: + +```bash +AAC 48000 FLTP 1ch +H264 960 720 +```