主頁 > 後端開發 > 基于 Web 實作 m3u8 視頻播放的簡單應用示例

基于 Web 實作 m3u8 視頻播放的簡單應用示例

2023-06-01 07:39:37 後端開發

基于 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"  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

宣告:歡迎任何形式的轉載,但請務必注明出處!!!

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/553942.html

標籤:Python

上一篇:< Python全景系列-9 > Python 裝飾器:優雅地增強你的函式和類

下一篇:返回列表

標籤雲
其他(160069) Python(38191) JavaScript(25469) Java(18172) C(15235) 區塊鏈(8268) C#(7972) AI(7469) 爪哇(7425) MySQL(7219) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5873) 数组(5741) R(5409) Linux(5344) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4580) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2434) ASP.NET(2403) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1979) 功能(1967) Web開發(1951) HtmlCss(1950) C++(1928) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1879) .NETCore(1863) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • 基于 Web 實作 m3u8 視頻播放的簡單應用示例

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

    uj5u.com 2023-06-01 07:39:37 more
  • < Python全景系列-9 > Python 裝飾器:優雅地增強你的函式和類

    裝飾器在 Python 中扮演了重要的角色,這是一種精巧的語言特性,讓我們能夠修改或增強函式和類的行為,無需修改它們的源代碼。這篇文章將深入探討裝飾器的所有相關主題,包括裝飾器的基礎知識、實作與使用、作業原理,以及通過實際例子學習裝飾器的獨特用法。 ......

    uj5u.com 2023-06-01 07:39:33 more
  • Java中序列化和反序列化解釋

    在Java中,序列化(Serialization)是指將物件的狀態轉換為位元組流的程序,以便將其保存到檔案、在網路中傳輸或持久化到資料庫中。而反序列化(Deserialization)則是將位元組流轉換回物件的程序,恢復物件的狀態。 序列化和反序列化主要用于以下場景: 1. 物件持久化:通過序列化,可以 ......

    uj5u.com 2023-06-01 07:39:08 more
  • 吃透Redis面試八股文

    > 內容摘自我的學習網站:topjavaer.cn Redis連環40問,絕對夠全! ## Redis是什么? Redis(`Remote Dictionary Server`)是一個使用 C 語言撰寫的,高性能非關系型的鍵值對資料庫。與傳統資料庫不同的是,Redis 的資料是存在記憶體中的,所以讀寫 ......

    uj5u.com 2023-06-01 07:38:56 more
  • 《面試1v1》synchronized

    > 原始碼都背下來了,你給我看這 **我是 javapub,一名 `Markdown` 程式員從👨?💻,八股文種子選手。** **面試官: 你好,我看到你的簡歷上寫著你熟悉 Java 中的 "synchronized" 關鍵字。你能給我講講它的作用嗎?** **候選人:** 當然,"synchro ......

    uj5u.com 2023-06-01 07:38:47 more
  • 單例模式

    ## 單例模式(反射破壞-列舉) #### 餓漢式單例 ~~~java package com.jan.single; //餓漢式單例 public class Hungry { //一上來就會加載好,可能會浪費空間 private byte[] data11=new byte[1024*1024] ......

    uj5u.com 2023-06-01 07:38:30 more
  • 【Netty實戰】1~3章學習筆記

    # 1. Netty總體結構 ## 1.1 Netty簡介 ? Netty是一款用于創建高性能網路應用程式的高級框架。它的基于 Java NIO 的異步的和事件驅動的實作,保證了高負載下應用程式性能的最大化和可伸縮性。 ? 其次,Netty 也包含了一組**設計模式**,將應用程式邏輯從網路層解耦, ......

    uj5u.com 2023-06-01 07:38:10 more
  • Spring MVC官方檔案學習筆記(二)之DispatcherServlet

    **1.DispatcherServlet入門** (1) Spring MVC是以前端控制器模式(即圍繞著一個中央的Servelt, DispatcherServlet)進行設計的,這個DispatcherServlet為請求的處理提供了一個共用的演算法,即它都會將實際的請求處理作業委托給那些可配置 ......

    uj5u.com 2023-06-01 07:37:57 more
  • 別再滿屏找日志了!推薦一款 IDEA 日志管理插件,看日志輕松多了!

    ![](https://img2023.cnblogs.com/other/1218593/202305/1218593-20230531145646615-374710580.png) ## **1.簡介** Grep Console是一款方便開發者對idea控制臺輸出日志進行個性化管理的插件。 ......

    uj5u.com 2023-06-01 07:36:36 more
  • StampedLock:高并發場景下一種比讀寫鎖更快的鎖

    摘要:在讀多寫少的環境中,有沒有一種比ReadWriteLock更快的鎖呢?有,那就是JDK1.8中新增的StampedLock! 本文分享自華為云社區《【高并發】高并發場景下一種比讀寫鎖更快的鎖》,作者: 冰 河。 什么是StampedLock? ReadWriteLock鎖允許多個執行緒同時讀取共 ......

    uj5u.com 2023-06-01 07:31:08 more