最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go語言學習之將mp4通過rtmp推送流媒體服務的實現(xiàn)方法

 更新時間:2022年12月24日 14:04:29   作者:劍客阿良_ALiang  
對音視頻一直是小白,決定沉下心來,好好研究一下音視頻知識,下面這篇文章主要給大家介紹了關于Go語言學習之將mp4通過rtmp推送流媒體服務的實現(xiàn)方法,需要的朋友可以參考下

前言

最近研究golang音視頻處理的時候,試著將mp4推送流媒體服務。下面分享一下代碼,大家有需要可以研究一下,按照自己的需求改改。

環(huán)境

需要安裝: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,可以按照幀率調整,因為讀取的速度比較快,會推太快。

執(zhí)行結果:

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}

拉流畫面:

這個代碼主要只是簡單的推流,沒有太多對視頻幀的處理。

如果有需要的話,可以自己集成一些其他的圖像處理的庫。

可以實現(xiàn)實時的視頻處理并推送的功能。

總結

到此這篇關于Go語言學習之將mp4通過rtmp推送流媒體服務實現(xiàn)的文章就介紹到這了,更多相關Go將mp4通過rtmp推送流媒體服務內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • go語言實現(xiàn)AES加密的方法

    go語言實現(xiàn)AES加密的方法

    這篇文章主要介紹了go語言實現(xiàn)AES加密的方法,實例分析了Go語言的加密技巧,需要的朋友可以參考下
    2015-03-03
  • Go channel發(fā)送方和接收方如何相互阻塞等待源碼解讀

    Go channel發(fā)送方和接收方如何相互阻塞等待源碼解讀

    這篇文章主要為大家介紹了Go channel發(fā)送方和接收方如何相互阻塞等待源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • Go 并發(fā)讀寫 sync.map 詳細

    Go 并發(fā)讀寫 sync.map 詳細

    閱讀本文你將會明確 sync.Map 和原生 map +互斥鎖/讀寫鎖之間的性能情況。標準庫 sync.Map 雖說支持并發(fā)讀寫 map,但更適用于讀多寫少的場景,因為他寫入的性能比較差,使用時要考慮清楚這一點。
    2021-10-10
  • golang使用mTLS實現(xiàn)雙向加密認證http通信

    golang使用mTLS實現(xiàn)雙向加密認證http通信

    這篇文章主要為大家介紹了golang如何調用mTLS實現(xiàn)雙向加密認證http通信,文中的示例代碼講解詳細,具有一定的學習價值,需要的小伙伴可以參考下
    2023-08-08
  • Go語言擴展原語之Semaphore的用法詳解

    Go語言擴展原語之Semaphore的用法詳解

    Go語言的擴展包中提供了帶權重的信號量?semaphore.Weighted,讓我們可以按照不同的權重管理資源的訪問,下面小編就來和大家聊聊它們的具體用法吧
    2023-07-07
  • 深入了解Go語言的基本語法與常用函數(shù)

    深入了解Go語言的基本語法與常用函數(shù)

    這篇文章主要為大家詳細介紹一下Go語言中的基本語法與常用函數(shù),文中的示例代碼講解詳細,對我們學習Go語言有一定的幫助,需要的可以參考一下
    2022-07-07
  • golang切片擴容規(guī)則實現(xiàn)

    golang切片擴容規(guī)則實現(xiàn)

    這篇文章主要介紹了golang切片擴容規(guī)則實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • Go語言基礎for循環(huán)語句的用法及示例詳解

    Go語言基礎for循環(huán)語句的用法及示例詳解

    這篇文章主要為大家介紹了Go語言基礎for循環(huán)語句的用法及示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2021-11-11
  • Go字典使用詳解

    Go字典使用詳解

    今天和大家一起學習Go語言的字典。Go語言的字典又稱為map,一種使用廣泛的數(shù)據(jù)結構。它是擁有key/value對元素的「無序集合」,而且在集合中key必須是唯一的
    2022-11-11
  • Go語言自帶測試庫testing使用教程

    Go語言自帶測試庫testing使用教程

    這篇文章主要為大家介紹了Go語言自帶測試庫testing使用教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07

最新評論

肥乡县| 巴马| 柯坪县| 南宫市| 宝山区| 布拖县| 道真| 出国| 全南县| 麻阳| 山东| 曲阳县| 灵寿县| 台东县| 林西县| 玉林市| 扶沟县| 廉江市| 巩义市| 大连市| 伊吾县| 都安| 自治县| 大竹县| 花垣县| 七台河市| 德清县| 从化市| 多伦县| 礼泉县| 裕民县| 都匀市| 东明县| 叶城县| 珲春市| 密云县| 同德县| 苍山县| 环江| 克东县| 正阳县|