使用golang 实现RTSP拉流然后录制成MP4格式文件
以下是使用golang实现RTSP拉流并录制成MP4格式文件的示例代码:
package main
import (
"fmt"
"os"
"os/signal"
"syscall"
"time"
"github.com/deepch/vdk/codec/h264parser"
"github.com/deepch/vdk/codec/sdp"
"github.com/deepch/vdk/format/rtsp"
"github.com/deepch/vdk/format/ts"
)
func main() {
// RTSP URL
uri := "rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov"
// 创建 RTSP 客户端连接
conn, err := rtsp.Dial(uri)
if err != nil {
panic(err)
}
defer conn.Close()
// 获取 RTSP 流媒体的 SDP 描述信息
sdpMessage, err := conn.Describe()
if err != nil {
panic(err)
}
// 解析 SDP 描述信息
sdpStruct, err := sdp.Parse(sdpMessage)
if err != nil {
panic(err)
}
// 获取视频流的信息
videoStream := sdpStruct.MediaDescriptions[0].MediaStream
// 创建 TS 格式的编码器
codec, err := ts.NewEncoder(ts.EncoderOptions{
AudioBufferSize: 100,
VideoBufferSize: 100,
})
if err != nil {
panic(err)
}
defer codec.Close()
// 创建 H264 视频解码器
h264Decoder := h264parser.NewDecoder()
// 打开 MP4 格式的文件进行录制
file, err := os.Create("output.mp4")
if err != nil {
panic(err)
}
defer file.Close()
// 开始拉流
err = conn.Setup(videoStream, rtsp.RTPInfo{
RTPTimestamp: 0,
SeqNumber: 0,
})
if err != nil {
panic(err)
}
// 捕捉系统中断信号来停止录制
stop := make(chan os.Signal, 1)
signal.Notify(stop, syscall.SIGINT, syscall.SIGTERM)
for {
select {
case <-stop:
fmt.Println("Recording stopped.")
return
default:
// 从 RTSP 流媒体中读取一帧数据
frame, err := conn.ReadFrame(videoStream)
if err != nil {
fmt.Println("Error reading frame:", err)
continue
}
// 解码 H264 视频帧
if frame.IsKeyFrame {
if err = codec.WriteHeaders(); err != nil {
fmt.Println("Error writing headers:", err)
continue
}
}
pkt := h264parser.SplitNALUs(frame.Data)
for _, nalu := range pkt {
if err = codec.WriteVideo(nalu); err != nil {
fmt.Println("Error writing video frame:", err)
continue
}
}
// 写入 TS 数据到文件
if err = codec.Flush(); err != nil {
fmt.Println("Error flushing codec:", err)
continue
}
for {
pkt, err := codec.ReadPacket()
if err != nil {
break
}
if _, err = file.Write(pkt.Data); err != nil {
fmt.Println("Error writing file:", err)
}
}
}
}
}
这个示例代码会拉取一个RTSP流,并将其编码为TS格式,然后解码成H264视频帧,最后将TS数据写入MP4文件中。在运行代码时,可以通过按下Ctrl+C来停止录制
原文地址: http://www.cveoy.top/t/topic/eqgz 著作权归作者所有。请勿转载和采集!