go语言调用上下文拉起ffmpeg,并引入livego做的简单流媒体服务器
Posted 轻歌曼舞
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go语言调用上下文拉起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 }
以上是关于go语言调用上下文拉起ffmpeg,并引入livego做的简单流媒体服务器的主要内容,如果未能解决你的问题,请参考以下文章
2023-02-23:请用go语言调用ffmpeg,解码mp4文件并保存为YUV420P格式文件。
2023-02-25:请用go语言调用ffmpeg,解码mp4文件并保存为YUV420SP格式文件,YUV420P不要转换成YUV420SP。
2023-02-24:请用go语言调用ffmpeg,解码mp4文件并保存为YUV420SP格式文件,采用YUV420P转YUV420SP的方式。
2023-03-12:mp3音频解码为pcm,代码用go语言编写,调用moonfdd/ffmpeg-go库。