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

Go語言利用原生庫實現(xiàn)屏幕截取和實時推流功能

 更新時間:2025年06月03日 10:21:06   作者:GetcharZp  
這篇文章主要為大家詳細介紹了Go語言利用原生庫實現(xiàn)一個高效的屏幕實時截圖推送服務,文中的示例代碼講解詳細,有需要的小伙伴可以了解下

本文介紹如何使用 Golang 原生庫 實現(xiàn)一個高效的屏幕實時截圖推送服務。不同于以往依賴 FFmpeg 的方案,我們通過 github.com/kbinani/screenshot 直接捕獲屏幕畫面,并將圖像以 JPEG 格式通過 HTTP 推送給前端瀏覽器播放。

核心功能

  • 屏幕截?。菏褂肎o捕獲當前屏幕內(nèi)容
  • 實時推流:將視頻流通過HTTP協(xié)議推送
  • Web播放:簡單HTML頁面驗證流媒體

Go后端實現(xiàn)

1. 全局幀緩存模塊 (frame_cache.go)

package main

import (
	"sync"
	"time"
)

var (
	frameCache     []byte
	frameCacheTime time.Time
	cacheMutex     sync.RWMutex
)

// 更新幀緩存
func updateFrameCache(frame []byte) {
	cacheMutex.Lock()
	defer cacheMutex.Unlock()
	frameCache = frame
	frameCacheTime = time.Now()
}

// 獲取幀緩存
func getFrameCache() ([]byte, time.Time) {
	cacheMutex.RLock()
	defer cacheMutex.RUnlock()
	return frameCache, frameCacheTime
}

2. 截屏服務模塊 (capture_service.go)

package main

import (
	"bytes"
	"image/jpeg"
	"log"
	"time"

	"github.com/kbinani/screenshot"
)

func startCaptureService() {
	ticker := time.NewTicker(time.Second / time.Duration(frameRate))
	defer ticker.Stop()

	for range ticker.C {
		img, err := screenshot.CaptureRect(screenBounds)
		if err != nil {
			log.Printf("截屏失敗: %v", err)
			continue
		}

		buf := new(bytes.Buffer)
		if err := jpeg.Encode(buf, img, &jpeg.Options{Quality: quality}); err != nil {
			log.Printf("JPEG編碼失敗: %v", err)
			continue
		}

		updateFrameCache(buf.Bytes())
	}
}

3. 流處理模塊 (stream_handler.go)

package main

import (
	"fmt"
	"net/http"
	"time"
)

func streamHandler(w http.ResponseWriter, r *http.Request) {
	w.Header().Set("Content-Type", "multipart/x-mixed-replace; boundary=frame")
	w.Header().Set("Cache-Control", "no-cache")
	w.Header().Set("Connection", "keep-alive")

	// 發(fā)送初始幀分隔符
	if _, err := w.Write([]byte("--frame\r\n")); err != nil {
		return
	}

	lastSent := time.Now()
	for {
		frame, frameTime := getFrameCache()

		// 只發(fā)送新幀
		if frameTime.After(lastSent) {
			if _, err := fmt.Fprintf(w,
				"Content-Type: image/jpeg\r\nContent-Length: %d\r\n\r\n",
				len(frame)); err != nil {
				return
			}

			if _, err := w.Write(frame); err != nil {
				return
			}

			if _, err := w.Write([]byte("\r\n--frame\r\n")); err != nil {
				return
			}

			if f, ok := w.(http.Flusher); ok {
				f.Flush()
			}

			lastSent = frameTime
		}

		// 防止CPU空轉(zhuǎn)
		time.Sleep(time.Second / time.Duration(frameRate*2))

		select {
		case <-r.Context().Done():
			return
		default:
		}
	}
}

4. 主程序模塊 (main.go)

package main

import (
	"image"
	"log"
	"net/http"

	"github.com/kbinani/screenshot"
)

var (
	quality      = 50                     // JPEG質(zhì)量(1-100)
	frameRate    = 10                     // 幀率(FPS)
	screenBounds = image.Rect(0, 0, 0, 0) // 屏幕尺寸
)

func main() {
	// 初始化截屏區(qū)域
	if n := screenshot.NumActiveDisplays(); n <= 0 {
		log.Fatal("未檢測到活動顯示器")
	}
	screenBounds = screenshot.GetDisplayBounds(0)

	// 啟動截屏服務
	go startCaptureService()

	// 設置路由
	http.HandleFunc("/stream", streamHandler)
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		http.ServeFile(w, r, "index.html")
	})

	// 啟動服務器
	log.Println("服務啟動: http://localhost:8080")
	log.Fatal(http.ListenAndServe(":8080", nil))
}

三、Web前端實現(xiàn)

創(chuàng)建一個簡單的index.html文件,前端直接用 image 標簽進行顯示即可:

<!DOCTYPE html>
<html>
<head>
    <title>Go屏幕流測試</title>
    <style>
        body { font-family: Arial, sans-serif; text-align: center; margin-top: 50px; }
        #video { max-width: 90%; border: 1px solid #ccc; margin: 20px auto; }
    </style>
</head>
<body>
    <h1>Go屏幕流測試播放器</h1>
    <img id="video" src="/stream" alt="視頻流">
    
    <div>
        <button onclick="window.location.reload()">重新加載</button>
    </div>
    
    <script>
        // 自動重連邏輯
        const video = document.getElementById('video');
        video.onerror = function() {
            setTimeout(function() {
                video.src = '/stream?t=' + new Date().getTime();
            }, 1000);
        };
    </script>
</body>
</html>

四、運行步驟

1.安裝依賴庫:

go get github.com/kbinani/screenshot

2.運行Go程序:

go run main.go

3.打開瀏覽器訪問: http://localhost:8080

五、技術要點說明

使用screenshot庫捕獲屏幕內(nèi)容

采用MJPEG(Motion-JPEG)格式推送視頻流

前端通過簡單的<img>標簽即可播放視頻流

自動重連機制確保網(wǎng)絡不穩(wěn)定時的觀看體驗

到此這篇關于Go語言利用原生庫實現(xiàn)屏幕截取和實時推流功能的文章就介紹到這了,更多相關Go屏幕截取內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Go語言單控制器和多控制器使用詳解

    Go語言單控制器和多控制器使用詳解

    這篇文章主要為大家詳細介紹了Go語言單控制器和多控制器的使用方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • Go語言中的os.Truncate函數(shù)用法解讀

    Go語言中的os.Truncate函數(shù)用法解讀

    這篇文章主要介紹了Go語言中的os.Truncate函數(shù)用法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-07-07
  • Golang實現(xiàn)協(xié)程超時控制的方式總結(jié)

    Golang實現(xiàn)協(xié)程超時控制的方式總結(jié)

    我們知道,go協(xié)程如果不做好處理,很容易造成內(nèi)存泄漏,所以對goroutine做超時控制,才能有效避免這種情況發(fā)生,本文為大家整理了兩個常見的Golang超時控制方法,需要的可以收藏一下
    2023-05-05
  • 一文帶你探索Go語言中crypto/md5標準庫的強大功能

    一文帶你探索Go語言中crypto/md5標準庫的強大功能

    我們將從MD5算法的基礎知識入手,逐步深入到如何在Go中有效使用crypto/md5標準庫,包括基本的使用方法、實際應用案例分析,以及性能和安全性的考量,需要的可以參考下
    2024-02-02
  • golang中的nil接收器詳解

    golang中的nil接收器詳解

    這篇文章主要介紹了golang中的nil接收器,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-10-10
  • Go中的動態(tài)速率限制有效控制流量

    Go中的動態(tài)速率限制有效控制流量

    這篇文章主要為大家介紹了Go中的動態(tài)速率限制有效控制流量,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • Go作用域的理解

    Go作用域的理解

    在Go語言中,作用域是指變量的可見性范圍,它定義了變量在程序中的生命周期和可訪問性,本文主要介紹了Go作用域的理解,包括局部作用域、全局作用域、命名空間作用域等,感興趣的可以了解一下
    2023-11-11
  • Go語言編譯環(huán)境設置教程

    Go語言編譯環(huán)境設置教程

    Go語言支持高并發(fā)(goroutine)、自動垃圾回收,編譯為跨平臺二進制文件,云原生兼容且社區(qū)活躍,開發(fā)便捷,內(nèi)置測試與vet工具輔助檢測錯誤,依賴模塊化管理,提升開發(fā)效率
    2025-07-07
  • Golang設計模式中抽象工廠模式詳細講解

    Golang設計模式中抽象工廠模式詳細講解

    抽象工廠模式用于生成產(chǎn)品族的工廠,所生成的對象是有關聯(lián)的。如果抽象工廠退化成生成的對象無關聯(lián)則成為工廠函數(shù)模式。比如本例子中使用RDB和XML存儲訂單信息,抽象工廠分別能生成相關的主訂單信息和訂單詳情信息
    2023-01-01
  • 使用IDEA配置GO語言的開發(fā)環(huán)境備忘錄

    使用IDEA配置GO語言的開發(fā)環(huán)境備忘錄

    最近在配置idea開發(fā)go語言時碰到很多問題,想著很多人都可能會遇到,所以下面這篇文章主要給大家介紹了關于使用IDEA配置GO語言的開發(fā)環(huán)境,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2024-05-05

最新評論

牟定县| 郸城县| 财经| 昭通市| 泗阳县| 怀化市| 英吉沙县| 札达县| 衡南县| 文安县| 海盐县| 金阳县| 县级市| 万荣县| 屏东县| 施秉县| 浦城县| 尉犁县| 响水县| 石棉县| 封开县| 崇明县| 德阳市| 江北区| 宁都县| 绵阳市| 新昌县| 明星| 本溪市| 当涂县| 盐城市| 临泽县| 天水市| 怀安县| 青川县| 阜新市| 巴塘县| 专栏| 平潭县| 达拉特旗| 永昌县|