Go语言利用ffmpeg转hls实现简单视频直播

 更新时间:2022年04月28日 17:04:17   作者:xiaoyaoyou.xyz  
这篇文章主要为大家介绍了Go语言利用ffmpeg转hls实现简单视频直播,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

1. 前言

上一次我们找到一些开源方案,目前我们先测试一下ffmpeg转hls播放的方式,看下延迟情况及兼容性情况,主要测试Windows、Linux和macOS中使用谷歌浏览器播放的情况。

后端结合我们之前的cgo部分,建立一个简单的http服务器,然后提供给前端调用。

2. wsl安装ffmpeg并转换rtsp为hls

sudo apt-get install ffmpeg

可能报错:

“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转换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创建简单的http服务,然后利用ffmpg转换hls提供给前端。

需要鉴权时rtsp地址前加上用户名密码时即可,比如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 href="https://vjs.zencdn.net/7.4.1/video-js.css" 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 用于在电脑端播放 如果只需手机播放可以不引入 -->
</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 简单使用
    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' //在重新添加视频源的时候需要给新的type的值
            })
        } else {
            myVideo.src(vdoSrc)
        }
        myVideo.load();
        myVideo.play();
    }
    // var src = "./test.m3u8";
    // document.querySelector('.qiehuan').addEventListener('click', function () {
    //     changeVideo(src);
    // })
</script>

4. 结果及评估

运行后端代码后访问localhost:9000即可查看视频,经测试延迟还是比较高的(我测试大致在5s-8s),如果要加上ptz控制的话没有实时感恐怕比较怪异,只适合简单的网络直播之类的,不太在乎一定的延迟。

以上就是go后端利用ffmpeg转hls做简单视频直播的详细内容,更多关于Go ffmpeg转hls视频直播的资料请关注脚本之家其它相关文章!

相关文章

  • 使用go实现一个超级mini的消息队列的示例代码

    使用go实现一个超级mini的消息队列的示例代码

    本文主要介绍了使用go实现一个超级mini的消息队列的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • 解决golang gin框架跨域及注解的问题

    解决golang gin框架跨域及注解的问题

    这篇文章主要介绍了解决golang gin框架跨域及注解的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • go语言中的Carbon库时间处理技巧

    go语言中的Carbon库时间处理技巧

    这篇文章主要介绍了go语言中的Carbon库时间处理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • 深入理解go sync.Waitgroup的使用

    深入理解go sync.Waitgroup的使用

    WaitGroup在go语言中,用于线程同步,本文主要介绍了深入理解go sync.Waitgroup的使用,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • golang并发执行的几种方式小结

    golang并发执行的几种方式小结

    本文主要介绍了golang并发执行的几种方式小结,主要包括了Channel,WaitGroup ,Context,使用这三种机制中的一种或者多种可以达到并发控制很好的效果,具有一定的参考价值,感兴趣的可以了解一下
    2023-08-08
  • Golang如何交叉编译各个平台的二进制文件详解

    Golang如何交叉编译各个平台的二进制文件详解

    这篇文章主要给大家介绍了关于Golang如何交叉编译各个平台的二进制文件的相关资料,并介绍了golang如何让编译生产的二进制文件变小,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-08-08
  • 浅谈go 协程的使用陷阱

    浅谈go 协程的使用陷阱

    这篇文章主要介绍了浅谈go 协程的使用陷阱,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Golang使用Zookeeper实现分布式锁

    Golang使用Zookeeper实现分布式锁

    分布式锁是一种在分布式系统中用于控制并发访问的机制,ZooKeeper 和 Redis 都是常用的实现分布式锁的工具,本文就来使用Zookeeper实现分布式锁,希望对大家有所帮助
    2024-02-02
  • golang类型推断与隐式类型转换

    golang类型推断与隐式类型转换

    这篇文章主要介绍了golang类型推断与隐式类型转换,golang类型推断可以省略类型,像写动态语言代码一样,让编程变得更加简单,同时也保留了静态类型的安全性
    2022-06-06
  • 使用go在mangodb中进行CRUD操作

    使用go在mangodb中进行CRUD操作

    这篇文章主要介绍了使用go在mangodb中进行CRUD操作,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-10-10

最新评论