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

Go語(yǔ)言利用ffmpeg轉(zhuǎn)hls實(shí)現(xiàn)簡(jiǎn)單視頻直播

 更新時(shí)間:2022年04月28日 17:04:17   作者:xiaoyaoyou.xyz  
這篇文章主要為大家介紹了Go語(yǔ)言利用ffmpeg轉(zhuǎn)hls實(shí)現(xiàn)簡(jiǎn)單視頻直播,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

1. 前言

上一次我們找到一些開源方案,目前我們先測(cè)試一下ffmpeg轉(zhuǎn)hls播放的方式,看下延遲情況及兼容性情況,主要測(cè)試Windows、Linux和macOS中使用谷歌瀏覽器播放的情況。

后端結(jié)合我們之前的cgo部分,建立一個(gè)簡(jiǎn)單的http服務(wù)器,然后提供給前端調(diào)用。

2. wsl安裝ffmpeg并轉(zhuǎn)換rtsp為hls

sudo apt-get install ffmpeg

可能報(bào)錯(cuò):

“E: Failed to fetch http://archive.ubuntu.com/ubuntu/pool/universe/f/flite/libflite1_2.1-release-3_amd64.deb Connection failed [IP: 91.189.88.142 80]”

解決辦法,可以選擇直接源碼編譯安裝:

wget https://ffmpeg.org/releases/ffmpeg-4.1.tar.bz2
tar -xjvf ffmpeg-4.1.tar.bz2
cd ffmpeg-4.1
sudo apt-get install yasm
./configure
make && sudo make install
ffmpeg -version

ffmpeg轉(zhuǎn)換rtsp為hls:

ffmpeg -i "rtsp://username:password@40.40.40.101/media/video1" -c copy -f hls -hls_time 2.0 -hls_list_size 0 -hls_wrap 15 "./test.m3u8"

3. 前后端示例代碼

3.1 后端go代碼

我們使用go創(chuàng)建簡(jiǎn)單的http服務(wù),然后利用ffmpg轉(zhuǎn)換hls提供給前端。

需要鑒權(quán)時(shí)rtsp地址前加上用戶名密碼時(shí)即可,比如rtsp://username:password@xxx,用戶名和密碼之間用:隔開,和原本的地址用@隔開。

main.go:

import (
   "fmt"
   "net/http"
   "os/exec"
   "bytes"
   "io/ioutil"
)

func Index(w http.ResponseWriter, r *http.Request) {
    content, _ := ioutil.ReadFile("./index.html")
    w.Write(content)
}

func main () {
    http.HandleFunc("/index", Index)
    http.Handle("/", http.FileServer(http.Dir(".")))
    go func() {
        http.ListenAndServe(":9000", nil)
    }()
    cmd := exec.Command("ffmpeg", "-i", "rtsp://admin:admin@40.40.40.101/media/video1", "-c", "copy", "-f", "hls", "-hls_time", "2.0", "-hls_list_size", "0", "-hls_wrap", "15", "./test.m3u8")
    var out bytes.Buffer
    var stderr bytes.Buffer
    cmd.Stdout = &out
    cmd.Stderr = &stderr
    err := cmd.Run()
    if err != nil {
        fmt.Println(fmt.Sprint(err) + ": " + stderr.String())
        return
    }
    fmt.Println("Result: " + out.String())
}

3.2 前端代碼

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>前端播放m3u8格式視頻</title>
    <link  rel="external nofollow"  rel="stylesheet">
    <script src='https://vjs.zencdn.net/7.4.1/video.js'></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/videojs-contrib-hls/5.15.0/videojs-contrib-hls.min.js" type="text/javascript"></script>
    <!-- videojs-contrib-hls 用于在電腦端播放 如果只需手機(jī)播放可以不引入 -->
</head>
<body>
<style>
    .video-js .vjs-tech {position: relative !important;}
</style>
<div>
    <video id="myVideo" class="video-js vjs-default-skin vjs-big-play-centered" controls preload="auto" data-setup='{}' style='width: 100%;height: auto'>
        <source id="source" src="http://localhost:9000/test.m3u8" type="application/x-mpegURL"></source>
    </video>
</div>
<!--<div class="qiehuan" style="width:100px;height: 100px;background: red;margin:0 auto;line-height: 100px;color:#fff;text-align: center">切換視頻</div>-->
</body>

<script>
    // videojs 簡(jiǎn)單使用
    var myVideo = videojs('myVideo', {
        bigPlayButton: true,
        textTrackDisplay: false,
        posterImage: false,
        errorDisplay: false,
    })
    myVideo.play()
    var changeVideo = function (vdoSrc) {
        if (/\.m3u8$/.test(vdoSrc)) { //判斷視頻源是否是m3u8的格式
            myVideo.src({
                src: vdoSrc,
                type: 'application/x-mpegURL' //在重新添加視頻源的時(shí)候需要給新的type的值
            })
        } else {
            myVideo.src(vdoSrc)
        }
        myVideo.load();
        myVideo.play();
    }
    // var src = "./test.m3u8";
    // document.querySelector('.qiehuan').addEventListener('click', function () {
    //     changeVideo(src);
    // })
</script>

4. 結(jié)果及評(píng)估

運(yùn)行后端代碼后訪問(wèn)localhost:9000即可查看視頻,經(jīng)測(cè)試延遲還是比較高的(我測(cè)試大致在5s-8s),如果要加上ptz控制的話沒(méi)有實(shí)時(shí)感恐怕比較怪異,只適合簡(jiǎn)單的網(wǎng)絡(luò)直播之類的,不太在乎一定的延遲。

以上就是go后端利用ffmpeg轉(zhuǎn)hls做簡(jiǎn)單視頻直播的詳細(xì)內(nèi)容,更多關(guān)于Go ffmpeg轉(zhuǎn)hls視頻直播的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Go語(yǔ)言學(xué)習(xí)之映射(map)的用法詳解

    Go語(yǔ)言學(xué)習(xí)之映射(map)的用法詳解

    Map是一種無(wú)序的鍵值對(duì)的集合。這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言中映射的用法,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Go語(yǔ)言有一定的幫助,需要的可以參考一下
    2022-04-04
  • Go語(yǔ)言實(shí)現(xiàn)讀取文件的方式總結(jié)

    Go語(yǔ)言實(shí)現(xiàn)讀取文件的方式總結(jié)

    這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言實(shí)現(xiàn)讀取文件的幾個(gè)方式,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Go語(yǔ)言有一定的幫助,感興趣的小伙伴可以收藏一下
    2023-04-04
  • Golang中間件設(shè)計(jì)示例詳解

    Golang中間件設(shè)計(jì)示例詳解

    這篇文章主要介紹了Golang中間件設(shè)計(jì)示例,中間件是在HTTP請(qǐng)求處理過(guò)程中,對(duì)請(qǐng)求進(jìn)行處理的一種模式,中間件可以在請(qǐng)求到達(dá)處理器之前或之后對(duì)請(qǐng)求進(jìn)行攔截,修改或者增強(qiáng),同時(shí)可以對(duì)響應(yīng)進(jìn)行處理,需要的朋友可以參考下
    2023-05-05
  • GO語(yǔ)言字符串處理Strings包的函數(shù)使用示例講解

    GO語(yǔ)言字符串處理Strings包的函數(shù)使用示例講解

    這篇文章主要為大家介紹了GO語(yǔ)言字符串處理Strings包的函數(shù)使用示例講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • Go語(yǔ)言類型轉(zhuǎn)換的方式有哪些

    Go語(yǔ)言類型轉(zhuǎn)換的方式有哪些

    本文主要介紹了Go語(yǔ)言類型轉(zhuǎn)換的方式有哪些,類型轉(zhuǎn)換主要有4種,分別為斷言類型轉(zhuǎn)換、顯式類型轉(zhuǎn)換、隱式類型轉(zhuǎn)換、強(qiáng)制類型轉(zhuǎn)換,感興趣的可以了解一下
    2023-11-11
  • Golang如何讀取單行超長(zhǎng)的文本詳解

    Golang如何讀取單行超長(zhǎng)的文本詳解

    這篇文章主要給大家介紹了關(guān)于Golang如何讀取單行超長(zhǎng)文本的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-12-12
  • uber go zap 日志框架支持異步日志輸出

    uber go zap 日志框架支持異步日志輸出

    這篇文章主要為大家介紹了uber go zap 日志框架支持異步日志輸出示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • Golang處理內(nèi)存溢出方式

    Golang處理內(nèi)存溢出方式

    本文介紹了Golang中分析內(nèi)存溢出問(wèn)題的三種工具:pprof、GoMemstats和程序crash時(shí)自動(dòng)創(chuàng)建dump文件,通過(guò)這些工具,可以對(duì)程序的內(nèi)存使用情況進(jìn)行詳細(xì)分析,從而找出內(nèi)存溢出的原因
    2024-12-12
  • Go中基本數(shù)據(jù)類型和字符串表示之間轉(zhuǎn)換詳解

    Go中基本數(shù)據(jù)類型和字符串表示之間轉(zhuǎn)換詳解

    這篇文章主要為大家詳細(xì)介紹了Go中基本數(shù)據(jù)類型和字符串表示之間轉(zhuǎn)換的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • Golang Gin框架中間件的用法詳解

    Golang Gin框架中間件的用法詳解

    中間件是Gin框架中的一個(gè)核心概念,它允許開發(fā)者在處理HTTP請(qǐng)求的過(guò)程中插入自定義的鉤子函數(shù),從而實(shí)現(xiàn)諸如日志記錄、身份驗(yàn)證、權(quán)限控制等公共邏輯,本文將結(jié)合實(shí)際案例,詳細(xì)講解Gin框架中間件的用法
    2024-10-10

最新評(píng)論

怀化市| 集安市| 蒙城县| 平阴县| 时尚| 西林县| 绩溪县| 东平县| 永兴县| 方城县| 鲁山县| 清丰县| 青岛市| 台中市| 鄂托克旗| 明水县| 南江县| 延边| 文水县| 锡林郭勒盟| 闵行区| 南昌县| 铁力市| 隆化县| 琼结县| 新晃| 皮山县| 镇平县| 彰化县| 裕民县| 淳化县| 凤庆县| 静乐县| 台北市| 新野县| 陈巴尔虎旗| 余姚市| 郁南县| 崇信县| 潮州市| 得荣县|