livego流媒体服务实现无插件播放视频(支持hls,flv)

一:简述

本文将描述如何使用livego配合flv.js 和hls.js 实现无插件的播放视频流。可以同时支持安卓、ios、PC端浏览器拉流。本示例所有的执行结果是windows下试验的。flvjs和hlsjs需要使用谷歌浏览器或者360浏览器极速模式可以访问。文章如有错误或者有什么更好的方式望大佬们指出相互学。感谢各位贡献出源码的大佬们。

二:环境准备

  1.   下载livego。编译好二进制文件下载路径   https://github.com/gwuhaolin/livego/releases)  
  2.   下载flv的js和hls的js文件,下图是我上传的资源文件的目录结构。是我们需要用到的一些文件 下载
    livego流媒体服务实现无插件播放视频(支持hls,flv)_第1张图片
  3.   下载编译好的livego可以实现推送rtmp的流转换成http的flv的视频流。但是再转换hls的视频流的地方有一个小bug。需要稍微改进一下。如果需要使用到hls的视频流。建议自己重新编译一下livego的源码。我自己重新编译了下livego的源码。可以直接  下载(如下载我编译好的文件。可以直接启动里面的程序。可以忽略livego源码编译部分

三:编译livego源码

  1.   下载livego源码   https://github.com/gwuhaolin/livego.git
    livego流媒体服务实现无插件播放视频(支持hls,flv)_第2张图片
    下载完成后,解压文件。源码的目录结构如下。将源代码放置

    GOPATH所在目录下的src目录。使用goland的编辑器。会自动识别src目录下的代码。


    livego流媒体服务实现无插件播放视频(支持hls,flv)_第3张图片
  2.   livego的源码导入的包很多是引入了gitbug上面的包。如果编译不能找到对应的包的话。可以将github上的导入包修改指定导入本地的包。导入包的目录是以GOPATH目录下的src目录为开始目录。所以目录结构应该是从livego/开始。可以按照此方式修改到本地。需改修改的地方很多,可以根据编译错误提示修改。修改完成后直接编译就可以了。或者使用命令行到对应目录下执行  go  build   livego.go 命令。
  3. livego流媒体服务实现无插件播放视频(支持hls,flv)_第4张图片livego流媒体服务实现无插件播放视频(支持hls,flv)_第5张图片
  4. 在推送视频流到livego的过程中。一直都是直接使用没有细细研究过其中的代码。由于后来项目中需要在苹果手机中播放视频流。总是播放hls的视频流失败。而安卓手机使用hls的js可以播放。即使如此安卓手机使用hls的js播放视频流也很不稳定。有些视频流可以有些流又不可以。我一度怀疑是不是自己的视频流的格式推送的又问题。后来无奈只好调试livego的程序。发现浏览器在向livego的服务请求视频流的时候,解析hls的视频流的路径出现了一个小bug。这也是go语言的函数中的一个小bug。hls.go文件里面解析路径出现了错误。strings.TrimRight的出的问题。直接修改代码去除后缀。
    修改代码如下:
    源码目录:livego\protocol\hls\hls.go  155行。修改一个函数。还修改了hls的延迟时间修改为1s
    key = strings.TrimRight(pathstr, path.Ext(pathstr)) 修改代码如下
    key = strings.TrimSuffix(pathstr, path.Ext(pathstr))  
    修改hls.go  18行。将duration 改为1000  减少hls的延迟
    
    
  5. 代码修改完成后,在使用命令go  build  livego就可以直接编译运行了。在goland的比编译器中直接运行。会提示找不到配置文件。因为livego需要读取配置文件livego.cfg.或者修改程序获取程序运行的当前路径。可以在编译器中直接运行。
     

四:使用ffmpeg推送视频流 

我上传的资源文件里面包含了ffmpeg库

livego流媒体服务实现无插件播放视频(支持hls,flv)_第6张图片

 使用ffmpeg推送本地的视频文件到livego。需要提醒的是:livego默认读取的配置文件里面livego.cfg文件

{
    "server": [
    {
    "appname":"live",
    "liveon":"on",
    "hlson":"on"
    }
    ]
}

推送的视频流路径前缀必须是  rtmp://IP:1935/live/******.否在livego不识别该路径。可以根据自己需要手动改写这个appname的值。下面给出使用ffmpeg命令推送、拉流的命令:

推送本地的文件到livego:  双击pushvideofile.bat文件就可以直接推送视频流了。(需要先启动livego

ffmpeg -re -i  %filepath%\video\Apache.mp4 -vcodec libx264 -acodec aac -f flv rtmp://127.0.0.1:1935/live/stream

推送rtsp的流到livego:

ffmpeg -re  -rtsp_transport tcp -i "rtsp://admin:admin@IP:554/media/video1" -f flv -vcodec copy -vprofile baseline -acodec copy -ar 44100 -strict -2 -ac 1 -f flv  -q 10  "rtmp://101.132.162.72:1935/live/stream"

拉流路径:

RTMP:rtmp://localhost:1935/live/stream
FLV:http://127.0.0.1:7001/live/stream.flv
HLS:http://127.0.0.1:7002/live/stream.m3u8

livego流媒体服务实现无插件播放视频(支持hls,flv)_第7张图片

可以先使用ffplay去播放三种视频流。确定视频流是否已经推送到livego中。我资源文件中都上传了对应的bat执行命令。双击即可。下图是我推送的一个本地文件,使用三种方式拉的视频流。可以看出hls的流明显比flv和rtmp的慢一些

五:使用flvjs和hlsjs播放视频流

成功推送视频流至livego中后。可以使用flvjs和hlsjs播放视频流。下面将使用谷歌浏览器和360浏览器极速模式获取的flv的视频流:

修改flvjs和hlsjs的demo中index.html对应的视频流的路径::

 

flv的js:修改index.html 67行对应得 url: 'http://127.0.0.1:7001/live/unv.flv', //<==自行修改
    修改需要播放得flv视频得url。flv.js得参数细节这里不作描述。可以自己上网查询。

hls的js:修改index.html 15行
    修改需要播放得hls视频得url。即可。苹果手机不需要js得支持。可以直接在原生得浏览器中输入http的流得地址即可播放。

livego流媒体服务实现无插件播放视频(支持hls,flv)_第8张图片

谷歌浏览器播放flv的视频:

livego流媒体服务实现无插件播放视频(支持hls,flv)_第9张图片360浏览器极速模式播放flv的视频流:hls的流可以按照相应的方式修改。这里就不做详述了。

livego流媒体服务实现无插件播放视频(支持hls,flv)_第10张图片

2020-04-19:

uuid.go的源文件也需要更改

/utils/uid/uuid.go:9:18: multiple-value uuid.NewV4() in single-value context

将报错文件第9行

id := uuid.NewV4() 改成 id,_ := uuid.NewV4()

livego-0.0.5的版本不是很稳定。不推荐大家使用

你可能感兴趣的:(音视频相关)