基於 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
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...