Go语言学习之将mp4通过rtmp推送流媒体服务的实现方法

2022-12-26 70阅读 0评论

?=前言

最近研究golang音视频处理的时候,试着将mp4推送流媒体服务。下面分享一下代码,大家有需要可以研究一下,按照自己的需求改改。

环境

需要安装github.com/yAPIngcat/GomeDIa

代码

代码如下:

package main   import ( 	"fmt" 	"github.com/yapingcat/GOmedia/go-codec" 	"Github.com/yapingcat/gomedia/go-mp4" 	"github.com/yapingcat/gomedia/go-rtmp" 	"io" 	.net" 	"os" 	"time" )   func main() { 	var ( 		mp4Path = "./data/movie1.mp4" 		rtmpURL = "rtmp://192.168.5.97:1935/live/home" 	) 	c, err := net.Dial("TCP4", "192.168.5.97:1935") 	if err != nil { 		fmt.Println(err) 	} 	cli := rtmp.NewRtmpClient(rtmp.WithComplexHandshake(), 		rtmp.WithComplexHandshakeschema(rtmp.HANDSHAKE_COMPLEX_SCHEMA1), 		rtmp.WithEnablePublish()) 	cli.OnError(func(code, describe string) { 		fmt.Printf("rtmp code:%s ,describe:%s\n", code, describe) 	}) 	isReady := make(chan Struct{}) 	cli.OnStatus(func(code, level, describe string) { 		fmt.Printf("rtmp onstatus code:%s ,level %s ,describe:%s\n", code, describe) 	}) 	cli.OnStateChange(func(newState rtmp.RtmpState) { 		if newState == rtmp.STATE_RTMP_PUBLISH_START { 			fmt.Println("ready for publish") 			Close(isReady) 		} 	}) 	cli.setOutput(func(bytes []byte) error { 		_, err := c.Write(bytes) 		return err 	}) 	go func() { 		<-isReady 		fmt.Println("start to read file") 		PushRtmp(mp4Path, cli) 	}()   	cli.Start(rtmpurl) 	buf := make([]byte, 4096) 	n := 0 	for err == nil { 		n, err = c.Read(buf) 		if err != nil { 			continue 		} 		cli.Input(buf[:n]) 	} 	fmt.Println(err) }   func PushRtmp(fileName string, cli *rtmp.RtmpClient) { 	mp4File, err := os.open(fileName) 	if err != nil { 		fmt.Println(err) 		return 	} 	Defer mp4File.Close() 	demuxer := mp4.CreateMp4Demuxer(mp4File) 	if infos, err := demuxer.ReadHead(); err != nil && err != io.EOF { 		fmt.Println(err) 	} else { 		fmt.Printf("%+v\n", infos) 	} 	mp4info := demuxer.GetMp4Info() 	fmt.Printf("%+v\n", mp4info) 	for { 		pkg, err := demuxer.ReadPacket() 		if err != nil { 			fmt.Println(err) 			break 		} 		if pkg.CID == mp4.MP4_CODEC_H264 { 			time.Sleep(30 * time.Millisecond) 			cli.WriteVideo(codec.CODECID_VIDEO_H264, pkg.Data, UInt32(pkg.PTS), uint32(pkg.Dts)) 		} else if pkg.Cid == mp4.MP4_CODEC_AAC { 			cli.WriteAudio(codec.CODECID_AUDIO_AAC, pkg.Data, uint32(pkg.Pts), uint32(pkg.Dts)) 		} else if pkg.Cid == mp4.MP4_CODEC_MP3 { 			cli.WriteAudio(codec.CODECID_AUDIO_MP3, pkg.Data, uint32(pkg.Pts), uint32(pkg.Dts)) 		} 	} }

代码说明:

1、如果是其他格式的话,可以按照里其他格式构建。

2、为什么在视频帧推送要睡30ms,可以按照帧率调整,因为读取速度比较快,会推太快。

执行结果:

rtmp onstatus code:NetStream.Publish.Start ,level Started publishing stream. ,describe:%!s(MISSING)ready for publishstart to read file[{DuratiON:299925 TrackId:1 Cid:1 Height:1080 Width:1920 SampleRate:0 SampleSize:0 channelCount:0 Timescale:24000 StarTDts:0 EndDts:299882} {Duration:299990 TrackId:2 Cid:102 Height:0 Width:0 SampleRate:48000 SampleSize:16 ChannelCount:2 Timescale:48000 StartDts:0 EndDts:299968}]{MajorBrand:1836020585 MinorVersion:512 CompatibleBrands:[1836020585 846164841 828601953 825520237] Duration:299990 Timescale:1000 CreateTime:0 modifyTime:0}

拉流画面:

Go语言学习之将mp4通过rtmp推送流媒体服务的实现方法

这个代码主要只是简单的推流,没有太多对视频帧的处理。

如果有需要的话,可以自己集成一些其他的图像处理的库。

可以实现实时的视频处理并推送的功能

总结

到此这篇关于Go语言学习之将mp4通过rtmp推送流媒体服务实现的文章就介绍到这了,更多相关Go将mp4通过rtmp推送流媒体服务内容请搜索云初冀北以前的文章或继续浏览下面的相关文章希望大家以后多多支持云初冀北!

免责声明
本站提供的资源,都来自网络,版权争议与本站无关,所有内容及软件的文章仅限用于学习和研究目的。不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负,我们不保证内容的长久可用性,通过使用本站内容随之而来的风险与本站无关,您必须在下载后的24个小时之内,从您的电脑/手机中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。侵删请致信E-mail:goliszhou@gmail.com
$

发表评论

表情:
评论列表 (暂无评论,70人围观)

还没有评论,来说两句吧...