GStreamerをGo言語で動かす
gst-launch-1.0 rtspsrc location=rtsp://cam:Cam12345@192.168.0.10/Src/MediaInput/stream_1 latency=0 ! rtph264depay ! avdec_h264 ! videoconvert ! videoscale ! video/x-raw,width=640,height=360 ! videorate ! video/x-raw,framerate=5/1 ! x264enc bitrate=1700 speed-preset=ultrafast tune=zerolatency key-int-max=1 ! mpegtsmux ! srtserversink uri = \"srt://192.168.101.10:38089\" latency=500
を実施するためだけのプログラムをGO言語で作成してください
package main
import (
"fmt"
"os"
"github.com/go-gst/go-glib/glib"
"github.com/go-gst/go-gst/gst"
)
func main() {
fmt.Println("starting.....")
// gstreamer初期化処理
gst.Init(&os.Args)
// メインループ生成
mainLoop := glib.NewMainLoop(glib.MainContextDefault(), false)
// パイプラインの要素を生成
source, _ := gst.NewElement("rtspsrc")
depay, _ := gst.NewElement("rtph264depay")
decoder, _ := gst.NewElement("avdec_h264")
convert, _ := gst.NewElement("videoconvert")
scale, _ := gst.NewElement("videoscale")
rate, _ := gst.NewElement("videorate")
filter1, _ := gst.NewElement("capsfilter")
filter2, _ := gst.NewElement("capsfilter")
encorder, _ := gst.NewElement("x264enc")
mux, _ := gst.NewElement("mpegtsmux")
sink, _ := gst.NewElement("srtsink")
// 各要素のプロパティを設定
source.SetProperty("location", "rtsp://cam:Cam12345@192.168.0.10/Src/MediaInput/stream_1")
source.SetProperty("latency", 0)
filter1.SetProperty("caps", gst.NewCapsFromString("video/x-raw,width=640,height=360"))
filter2.SetProperty("caps", gst.NewCapsFromString("video/x-raw,framerate=5/1"))
encorder.SetProperty("bitrate", 1700)
encorder.SetProperty("speed-preset", "ultrafast")
encorder.SetProperty("tune", "zerolatency")
encorder.SetProperty("key-int-max", 1)
sink.SetProperty("uri", "srt://192.168.101.10:38089")
sink.SetProperty("latency", 500)
// パイプラインを生成して要素を追加
pipeline, _ := gst.NewPipeline("video_player")
pipeline.AddMany(source, depay, decoder, convert, scale, rate, filter1, filter2, encorder, mux, sink)
gst.ElementLinkMany(depay, decoder, convert, scale, rate, filter1, filter2, encorder, mux, sink)
// 動的パッドのリンク
source.Connect("pad-added", func(element *gst.Element, pad *gst.Pad) {
pad.Link(depay.GetStaticPad("sink"))
})
// パイプラインメッセージ読取
pipeline.GetPipelineBus().AddWatch(func(msg *gst.Message) bool {
switch msg.Type() {
case gst.MessageEOS: // end-of-streamを受信したらパイプラインを停止
pipeline.BlockSetState(gst.StateNull)
mainLoop.Quit()
case gst.MessageError: // エラーメッセージはFatalにする
err := msg.ParseError()
fmt.Println("ERROR:", err.Error())
if debug := err.DebugString(); debug != "" {
fmt.Println("DEBUG:", debug)
}
mainLoop.Quit()
default:
// 受信メッセージの表示
fmt.Println(msg)
}
return true
})
// パイプライン開始
pipeline.SetState(gst.StatePlaying)
// メインループ開始
mainLoop.Run()
}