<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
最近研究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:%sn", code, describe) }) isReady := make(chan struct{}) cli.OnStatus(func(code, level, describe string) { fmt.Printf("rtmp onstatus code:%s ,level %s ,describe:%sn", 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("%+vn", infos) } mp4info := demuxer.GetMp4Info() fmt.Printf("%+vn", 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 publish
start 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推播串流媒體服務內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45