ホームページ バックエンド開発 Golang Go言語を使用してHLSプロトコルを実装する方法

Go言語を使用してHLSプロトコルを実装する方法

Apr 05, 2023 am 09:10 AM

HLS (HTTP Live Streaming) は、Apple が提案したビデオ ストリーミング プロトコルです。他のプラットフォームでは、HLS プロトコルを使用してビデオ ストリームを送信することもできます。たとえば、Android プラットフォームでは、Google ExoPlayer も HLS ビデオ ストリームの再生をサポートします。 HLS プロトコルは主に、元のビデオ ファイルを一連の小さなファイルに分割します。これらの小さなファイルはセグメントと呼ばれます。これらのフラグメントは、H.264 などの対応するエンコード形式にエンコードする必要があります。クライアントは、HTTP プロトコルを通じてこの一連のフラグメントを取得します。クライアントはフラグメントを取得すると、そのフラグメントの再生を開始します。このセグメントが再生されると、クライアントは次のセグメントを取得して再生します。このようにして、完全なビデオを再生できます。

Go 言語は非常にシンプルで効率的で、同時プログラミングに非常に適した言語です。 Go 言語では、HLS プロトコルの実装は非常に簡単です。この記事では、Go言語を使用してHLSプロトコルを実装する方法を紹介します。

まず、基本的な HTTP サーバー コードを構築する必要があります。コードのこの部分は非常に単純で、リスニング アドレスとポートを備えた HTTP サーバーを作成するだけです。クライアントがサーバーにアクセスすると、サーバー上のファイルを取得し、そのファイルの内容をクライアントに返すことができます。

package main

import (
    "io/ioutil"
    "net/http"
)

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        data, _ := ioutil.ReadFile("example.mp4")
        w.Write(data)
    })

    http.ListenAndServe(":8000", nil)
}
ログイン後にコピー

このコードでは、ポート 8000 でリッスンする HTTP サーバーを作成します。クライアントがこのサーバーにアクセスすると、example.mp4 ファイルの内容がクライアントに返されます。

次に、HLS プロトコルのスライシングを実装するコードを記述する必要があります。コードのこの部分は非常に重要です。 HLS プロトコル全体の中核は、ビデオ ファイルを多数の小さなフラグメントに分割し、これらのフラグメントを HTTP プロトコルを通じてクライアントに送信することです。この機能を実装するにはコードを記述する必要があります。

package main

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

func main() {

    // 执行 ffmpeg 命令将 example.mp4 文件切割成小的分片
    segmentDir := "segment"
    if _, err := os.Stat(segmentDir); os.IsNotExist(err) {
        os.Mkdir(segmentDir, os.ModePerm)
    }

    cmd := exec.Command("ffmpeg", "-i", "example.mp4", "-profile:v", "baseline", "-level", "3.0", "-start_number", "0", "-hls_time", "10", "-hls_list_size", "0", "-f", "hls", filepath.Join(segmentDir, "out.m3u8"))
    err := cmd.Run()
    if err != nil {
        fmt.Println("exec cmd failed")
        panic(err)
    }

    // 启动 HTTP 服务器用于客户端获取切片文件
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {

        if r.URL.Path == "/out.m3u8" {

            // 获取 m3u8 文件的内容,此文件是一个播放列表,里面包含了可以播放的 ts 文件的序列
            data, _ := ioutil.ReadFile(filepath.Join(segmentDir, "out.m3u8"))
            w.Write(data)

        } else if len(r.URL.Path) > len("/segment/") && r.URL.Path[0:9] == "/segment/" {

            // 如果客户端要求播放某个 ts 文件,那么我们就需要从本地文件系统读取这个文件并且返回给客户端
            data, _ := ioutil.ReadFile(filepath.Join(segmentDir, r.URL.Path[1:]))
            http.ServeContent(w, r, "", 0, bytes.NewReader(data))

        }

    })

    // 启动 HTTP 服务器
    http.ListenAndServe(":8000", nil)
}
ログイン後にコピー

このコードでは、主に Go 言語の os/exec パッケージを使用して外部コマンドを実行します。シェル プロセスが開始され、対応するコマンドが実行されます。この例では、ffmpeg コマンドを使用して example.mp4 ファイルを複数の小さなセグメントに分割し、これらのセグメントを segment ディレクトリに保存します。次に、これらのフラグメントを HTTP プロトコル経由で再生するためにクライアントに提供できます。

クライアントが /out.m3u8 をリクエストすると、シャードのリストをクライアントに直接返します。クライアントが /segment/xxx をリクエストした場合、ローカル ファイル システム上の対応するセグメントを読み取り、クライアントに返す必要があります。

ついに、Go 言語を使用して HLS プロトコルを実装することに成功しました。 Go 言語のシンプルさと効率性は、高い同時実行性と高いスループットを必要とするアプリケーション シナリオに非常に適しています。機会があれば、ぜひ Go に HLS プロトコルを実装してみてください。

以上がGo言語を使用してHLSプロトコルを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Debian OpenSSLの脆弱性は何ですか Debian OpenSSLの脆弱性は何ですか Apr 02, 2025 am 07:30 AM

OpenSSLは、安全な通信で広く使用されているオープンソースライブラリとして、暗号化アルゴリズム、キー、証明書管理機能を提供します。ただし、その歴史的バージョンにはいくつかの既知のセキュリティの脆弱性があり、その一部は非常に有害です。この記事では、Debian SystemsのOpenSSLの共通の脆弱性と対応測定に焦点を当てます。 Debianopensslの既知の脆弱性:OpenSSLは、次のようないくつかの深刻な脆弱性を経験しています。攻撃者は、この脆弱性を、暗号化キーなどを含む、サーバー上の不正な読み取りの敏感な情報に使用できます。

フロントエンドからバックエンドの開発に変身すると、JavaやGolangを学ぶことはより有望ですか? フロントエンドからバックエンドの開発に変身すると、JavaやGolangを学ぶことはより有望ですか? Apr 02, 2025 am 09:12 AM

バックエンド学習パス:フロントエンドからバックエンドへの探査の旅は、フロントエンド開発から変わるバックエンド初心者として、すでにNodeJSの基盤を持っています...

GOの浮動小数点番号操作に使用されるライブラリは何ですか? GOの浮動小数点番号操作に使用されるライブラリは何ですか? Apr 02, 2025 pm 02:06 PM

GO言語の浮動小数点数操作に使用されるライブラリは、精度を確保する方法を紹介します...

Go's Crawler Collyのキュースレッドの問題は何ですか? Go's Crawler Collyのキュースレッドの問題は何ですか? Apr 02, 2025 pm 02:09 PM

Go Crawler Collyのキュースレッドの問題は、Go言語でColly Crawler Libraryを使用する問題を調査します。 �...

Beego ormのモデルに関連付けられているデータベースを指定する方法は? Beego ormのモデルに関連付けられているデータベースを指定する方法は? Apr 02, 2025 pm 03:54 PM

Beegoormフレームワークでは、モデルに関連付けられているデータベースを指定する方法は?多くのBEEGOプロジェクトでは、複数のデータベースを同時に操作する必要があります。 Beegoを使用する場合...

Goでは、Printlnとstring()関数を備えた文字列を印刷すると、なぜ異なる効果があるのですか? Goでは、Printlnとstring()関数を備えた文字列を印刷すると、なぜ異なる効果があるのですか? Apr 02, 2025 pm 02:03 PM

Go言語での文字列印刷の違い:printlnとstring()関数を使用する効果の違いはGOにあります...

Redisストリームを使用してGO言語でメッセージキューを実装する場合、user_idタイプの変換の問題を解決する方法は? Redisストリームを使用してGO言語でメッセージキューを実装する場合、user_idタイプの変換の問題を解決する方法は? Apr 02, 2025 pm 04:54 PM

redisstreamを使用してGo言語でメッセージキューを実装する問題は、GO言語とRedisを使用することです...

Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか? Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか? Apr 02, 2025 pm 05:09 PM

Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか?ゴーランドを使用するためにGolandを使用する場合、多くの開発者はカスタム構造タグに遭遇します...

See all articles