基於 Web 實現 m3u8 視頻播放的簡單應用示例

来源:https://www.cnblogs.com/yuzhihui/archive/2023/05/31/17444070.html
-Advertisement-
Play Games

# 基於 Web 實現 m3u8 視頻播放的簡單應用示例 ## 實現思路 將視頻(MP4 等)轉換為 M3U8 視頻的服務,可以按照以下步驟進行操作: 1. 將視頻(MP4 等)轉換為 M3U8:在服務中,使用適當的工具(如 FFmpeg)將接收到的視頻(MP4 等)轉換為 M3U8 格式。這將生成 ...


基於 Web 實現 m3u8 視頻播放的簡單應用示例

實現思路

將視頻(MP4 等)轉換為 M3U8 視頻的服務,可以按照以下步驟進行操作:

  1. 將視頻(MP4 等)轉換為 M3U8:在服務中,使用適當的工具(如 FFmpeg)將接收到的視頻(MP4 等)轉換為 M3U8 格式。這將生成一個包含視頻流的 M3U8 文件以及相應的分段(TS)文件。

  2. 提供邊下邊播服務:將生成的 M3U8 文件和分段文件存儲在適當的位置(如伺服器上的文件夾或雲存儲服務中)。然後,可以通過將這些文件的 URL 提供給前端,使前端能夠通過邊下邊播的方式逐段載入和播放視頻。

  3. 前端實現 M3U8 播放器:在前端,可以使用現有的視頻播放器庫(如 video.js、plyr.js 等)或基於 HLS(HTTP Live Streaming)協議的播放器庫(如 hls.js)來實現 M3U8 視頻的播放器。這些庫可以通過提供 M3U8 文件的 URL 來載入和播放視頻。

一、將視頻(MP4 等)轉換為 M3U8 視頻

使用 Python 實現將 MP4 視頻轉換為 M3U8 視頻,按照以下步驟進行操作:

  1. 安裝所需的庫:首先,確保已安裝所需的庫。在 Python 中,可以使用 ffmpeg-python 庫來與 FFmpeg 進行交互,以執行視頻轉換操作。可以使用以下命令安裝該庫:
pip install ffmpeg-python
  1. 導入庫和設置轉換函數:在 Python 代碼中,導入 ffmpeg 模塊,並創建一個函數,用於將 MP4 轉換為 M3U8。以下是一個示例代碼:
import ffmpeg

def convert_mp4_to_m3u8(input_file, output_file):
    """
    Converts an MP4 file to an M3U8 file using ffmpeg.
    Args:
        input_file (str): The path to the input MP4 file.
        output_file (str): The path to the output M3U8 file.
    Returns:
        bool: True if the conversion was successful, False otherwise.
    """
    try:
        ffmpeg.input(input_file).output(output_file, format='hls', hls_time=10, hls_segment_type='mpegts').run()
        return True
    except ffmpeg.Error as e:
        print(f"An error occurred during video conversion: {e.stderr}")
        return False

在這個示例代碼中,convert_mp4_to_m3u8 函數接受輸入文件路徑和輸出文件路徑作為參數。它使用 FFmpeg 將輸入文件轉換為 M3U8 格式,並將分段(TS)文件輸出到指定的輸出文件路徑。

二、實現 HTTP 伺服器,提供 M3U8 視頻的訪問

方法一、使用 Python 標準庫中的 http.server 模塊

這個模塊提供了一個簡單的 HTTP 伺服器,可以處理 GET 和 HEAD 請求,並可以為客戶端提供靜態文件。

以下是一個簡單的示例代碼,可以啟動一個 HTTP 伺服器併為客戶端提供視頻等資源的訪問:

import http.server
import socketserver

PORT = 8000

Handler = http.server.SimpleHTTPRequestHandler

with socketserver.TCPServer(("", PORT), Handler) as httpd:
    print("serving at port", PORT)
    httpd.serve_forever()

在這個示例中,創建了一個 http.server.SimpleHTTPRequestHandler 處理程式,它可以處理 GET 和 HEAD 請求,並可以為客戶端提供靜態文件。然後,使用 socketserver.TCPServer 創建一個 TCP 伺服器,並將處理程式傳遞給它。最後,調用 serve_forever() 方法開始監聽來自客戶端的請求。

將視頻等資源放在伺服器的根目錄下,例如 ./video.m3u8,客戶端可以通過瀏覽器訪問 http://localhost:8000/video.m3u8 來獲取該資源。客戶端也可以使用其他 HTTP 客戶端程式(例如 curl 或者 wget)來訪問資源。

不過需要註意的是,這種方式只適合提供小型的靜態文件。如果要提供大型視頻等資源,最好使用專門的伺服器軟體來處理,例如 Apache 或 Nginx。

方法二、使用 Flask 框架

Flask 框架可以提供一種更為靈活的方式來實現視頻等靜態資源的訪問。下麵是一個簡單的示例代碼:

from flask import Flask, send_from_directory

app = Flask(__name__)

@app.route('/<path:path>')
def static_file(path):
    return send_from_directory('.', path)

if __name__ == '__main__':
    app.run(port=8000)

在這個示例中,定義了一個名為 static_file 的路由,它可以處理所有的 HTTP GET 請求,並使用 send_from_directory 函數返回請求的文件。在這裡,將請求的文件從當前目錄中返回。如果要返回其他目錄下的文件,可以將 send_from_directory 函數的第一個參數設置為目錄的路徑。

要訪問視頻等靜態資源,可以將它們放在與 Flask 應用程式相同的目錄中,並使用相對路徑作為 URL。例如,如果視頻文件名為 video.m3u8,可以使用 http://localhost:8000/video.m3u8 訪問該文件。

需要註意的是,這種方式也適用於小型的靜態文件。如果要提供大型視頻等資源,最好使用專門的伺服器軟體來處理,例如 Apache 或 Nginx。另外,這裡的示例代碼只提供了最簡單的靜態資源訪問功能,如果需要更高級的功能(例如緩存控制、安全性等),可以使用 Flask 擴展或者在代碼中自行實現。

三、Web 前端播放 M3U8 視頻

M3U8 是一種基於 HTTP Live Streaming (HLS) 協議的視頻流播放格式(在播放 M3U8 文件時需要將視頻文件和 M3U8 文件都放在 HTTP 伺服器上,並通過 HTTP 協議進行訪問)。要在 Web 前端中實現 M3U8 播放器,可以使用一些開源的 JavaScript 庫,例如 hls.jsvideo.js

hls.js 是一個基於 JavaScript 實現的 M3U8 播放器庫。它可以自動檢測瀏覽器是否支持 HLS,如果不支持則使用 Flash 播放器來進行播放。以下是一個使用 hls.js 的示例代碼:

<!DOCTYPE html>
<html>
  <head>
    <title>hls.js player example</title>
    <script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
  </head>
  <body>
    <video id="video" controls></video>
    <script>
      var video = document.getElementById("video");
      if (Hls.isSupported()) {
        var hls = new Hls();
        hls.loadSource("http://127.0.0.1:8000/path/to/video.m3u8");
        hls.attachMedia(video);
        hls.on(Hls.Events.MANIFEST_PARSED, function () {
          // video.play();
        });
      } else if (video.canPlayType("application/vnd.apple.mpegurl")) {
        video.src = "http://127.0.0.1:8000/path/to/video.m3u8";
        video.addEventListener("loadedmetadata", function () {
          // video.play();
        });
      }
    </script>
  </body>
</html>

在這個示例中,首先��頁面中引入了 hls.js 庫。然後,創建一個 HTML5 video 元素,併為它設置了 controls 屬性,以便用戶可以控制視頻的播放。

接著,使用 Hls.isSupported() 方法檢測瀏覽器是否支持 HLS。如果支持,則創建一個 Hls 對象,並使用 loadSource 方法載入 M3U8 文件。然後,使用 attachMedia 方法將 video 元素附加到 Hls 對象上,併在 MANIFEST_PARSED 事件觸發時開始播放視頻。

如果瀏覽器不支持 HLS,就檢測是否支持 application/vnd.apple.mpegurl 格式。如果支持,則為 video 元素的 src 屬性設置 M3U8 文件的路徑,併在 loadedmetadata 事件觸發時開始播放視頻。

除了 hls.js,還有一些其他的 JavaScript 庫可以用來實現 M3U8 播放器,例如 video.js。下麵是一個使用 video.js 的示例代碼:

<!DOCTYPE html>
<html>
  <head>
    <title>video.js player example</title>
    <link href="https://vjs.zencdn.net/8.3.0/video-js.css" rel="stylesheet" />
    <script src="https://vjs.zencdn.net/8.3.0/video.min.js"></script>
  </head>
  <body>
    <video id="video" class="video-js vjs-default-skin" controls></video>
    <script>
      var video = videojs("video", {
        techOrder: ["html5", "flash"],
        sources: [
          {
            src: "http://127.0.0.1:8000/path/to/video.m3u8",
            type: "application/x-mpegURL",
          },
        ],
      });
      // video.play();
    </script>
  </body>
</html>

在這個示例中,首先引入了 video.js 的 CSS 和 JavaScript 文件。然後,創建了一個 HTML5 video 元素,併為它設置了 class 屬性,以便應用 video.js 的預設樣式。

接著,使用 videojs 函數創建一個 video.js 對象,併為其指定了 techOrdersources 選項。techOrder 選項指定了播放視頻時使用的技術順序,如果瀏覽器不支持 HLS,則會使用 Flash 播放器來進行播放。sources 選項指定了待播放的 M3U8 文件的路徑和類型。

最後,調用 play 方法開始播放視頻。

作者:飛仔FeiZai

出處:https://www.cnblogs.com/yuzhihui/p/17444070.html

聲明:歡迎任何形式的轉載,但請務必註明出處!!!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ### 解釋器模式(Interpreter Pattern) #### 一、定義 解釋器模式(Interpreter Pattern)提供了評估語言的語法或表達式的方式,它屬於行為型模式。這種模式實現了一個表達式介面,該介面解釋一個特定的上下文。這種模式被用在 SQL 解析、符號處理引擎等。 給定一 ...
  • 在Java中,序列化(Serialization)是指將對象的狀態轉換為位元組流的過程,以便將其保存到文件、在網路中傳輸或持久化到資料庫中。而反序列化(Deserialization)則是將位元組流轉換回對象的過程,恢復對象的狀態。 序列化和反序列化主要用於以下場景: 1. 對象持久化:通過序列化,可以 ...
  • > 內容摘自我的學習網站:topjavaer.cn Redis連環40問,絕對夠全! ## Redis是什麼? Redis(`Remote Dictionary Server`)是一個使用 C 語言編寫的,高性能非關係型的鍵值對資料庫。與傳統資料庫不同的是,Redis 的數據是存在記憶體中的,所以讀寫 ...
  • > 本文首發於公眾號:Hunter後端 > 原文鏈接:[Python連接es筆記四之創建和刪除操作](https://mp.weixin.qq.com/s/ZCe0JT9TDEiZI7M5dxC9qA) 這一篇筆記介紹一下索引和數據的創建和刪除。 其實對於索引來說,如果可以接觸到 kibana 的話 ...
  • > 源碼都背下來了,你給我看這 **我是 javapub,一名 `Markdown` 程式員從👨‍💻,八股文種子選手。** **面試官: 你好,我看到你的簡歷上寫著你熟悉 Java 中的 "synchronized" 關鍵字。你能給我講講它的作用嗎?** **候選人:** 當然,"synchro ...
  • # 1. Netty總體結構 ## 1.1 Netty簡介 ​ Netty是一款用於創建高性能網路應用程式的高級框架。它的基於 Java NIO 的非同步的和事件驅動的實現,保證了高負載下應用程式性能的最大化和可伸縮性。 ​ 其次,Netty 也包含了一組**設計模式**,將應用程式邏輯從網路層解耦, ...
  • 1. 多線程程式在一個核的CPU運行 ![image.png](https://cdn.nlark.com/yuque/0/2023/png/35902537/1685453577663-714d9c16-e8a3-4828-bb86-86dfa10c8e52.png#averageHue=%23f ...
  • ![](https://img2023.cnblogs.com/other/1218593/202305/1218593-20230531145646615-374710580.png) ## **1.簡介** Grep Console是一款方便開發者對idea控制台輸出日誌進行個性化管理的插件。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...