go語言與java nio通信,解析命令調用上下文拉起ffmpeg,並引入livego做的簡單流媒體服務器


想給項目組推一套視頻的播放方案,用於播放ip camera的的實時流,網上有很多人已經做過了,我這邊是使用golang,拉起上下文調用ffmpeg命令,獲取rtsp轉到livego的服務上,然后界面找我獲取播放流的方式。

實現如下:

調用命令行的部分如下

package ffmpeg

import (
    "bytes"
    "context"
    "os"
    "os/exec"
    "syscall"
    "time"
)

type C struct {
    Name   string
    ctx    context.Context
    cancel context.CancelFunc
    cmd    *exec.Cmd
}

func New(name string, args []string) C {
    var c C
    c.Name = name
    c.ctx, c.cancel = context.WithCancel(context.Background())
    c.cmd = exec.CommandContext(c.ctx, "ffmpeg", args...)
    c.cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}
    c.cmd.Stdout = os.Stdout
    return c
}

func (c *C) Run() error {
    return c.cmd.Start()
}

func (c *C) RunThenClose(ch chan int) error {
    err := c.cmd.Start()
    c.cancel()
    //tell go i take it
    return err
}

func (c *C) Close() {
    c.cancel()
}

//run and wait for back
func RunAndClose(args []string, callback func(c, t time.Duration)) error {
    cmd := exec.Command("ffmpeg", args...)

    if callback == nil {
        var cmdErr bytes.Buffer
        cmd.Stderr = &cmdErr

        if err := cmd.Run(); err != nil {
            return extractError(err, cmdErr.String())
        }

        return nil
    }

    // ffmpeg stdout is stderr
    stderr, err := cmd.StderrPipe()
    if err != nil {
        return err
    }

    w, err := newWatcher(stderr, callback)
    if err != nil {
        return err
    }

    defer w.Close()
    defer cmd.Process.Wait()

    if err := cmd.Run(); err != nil {
        return err
    }

    return nil
}
ffmpeg.go

 

工程路徑

https://github.com/wenchengyao/smpNVR.git

 

實現效果:

每次啟動,更具配置,連接到我們java nio開發的服務端,接收用戶發起的界面請求,

解析請求進行視頻直流、抓圖等

 

界面上的播放效果:

ffmpeg命令開啟rtsp的連接還非常穩定,我試過連續播放1400分鍾

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM