您好,登錄后才能下訂單哦!
本篇內容介紹了“go后端利用ffmpeg轉hls做簡單視頻直播的方法”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
目前我們先測試一下ffmpeg轉hls播放的方式,看下延遲情況及兼容性情況,主要測試Windows、Linux和macOS中使用谷歌瀏覽器播放的情況。后端結合我們之前的cgo部分,建立一個簡單的http服務器,然后提供給前端調用。
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"
我們使用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()) }
<!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" >切換視頻</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>
運行后端代碼后訪問localhost:9000即可查看視頻,經測試延遲還是比較高的(我測試大致在5s-8s),如果要加上ptz控制的話沒有實時感恐怕比較怪異,只適合簡單的網絡直播之類的,不太在乎一定的延遲。
“go后端利用ffmpeg轉hls做簡單視頻直播的方法”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。