1. 程式人生 > >windows下flv視訊網站進度條隨意拖放

windows下flv視訊網站進度條隨意拖放

網站中視訊都轉換成flv格式,奈何flv格式無法拖拽,此問題糾結了好久,最終得以解決。現將解決思路記錄下來,大多數源於網上找到的。

視訊拖拽滿足要求

1.播放器要支援

2.flv視訊要有關鍵幀和meta資訊

3.伺服器端要支援

總體而言分兩步:

一、視訊關鍵幀的處理;二、Nginx代理伺服器

1. 問題的產生

Flash視訊播放方案原理其實比較簡單:網頁端放置一個Flash編寫的播放器,播放器通過http協議訪問一個flv檔案,通過Flash本身的視訊解碼功能進行視訊播放。在播放過程中,為了視訊的流暢播放器會對接下來要播放部分的資料做一些預讀取。

具體來說,我們只需要把flv檔案放在網站目錄下,讓播放器指向這個地址就可以播放了。

但是,這樣製作好的播放器方案,在實際使用中會遇到一個問題:當用戶拖動進度到還未緩衝的部分時,播放器會停止播放或者是回到視訊的開始。這就是標題中的“對未緩衝進度條實現拖動”。

2. 原理與解決

設想一下,對於本地視訊檔案的拖動,播放器需要呼叫哪些接口才能實現呢?

  1. 通過某個API得知視訊中某時刻對應的資料相對於檔案頭的偏移量;
  2. 通過某個API得到視訊資料中指定偏移量以後的資料;
  3. 播放器本身要支援偏移訪問和播放

對於網路是視訊,同樣需要這兩個關鍵的介面。很遺憾的,預設狀態下(上面說的把flv檔案直接放在IIS host的目錄下)這兩個條件都不具備。

  1. Flv檔案一般不包含keyframe和meta資訊。keyframe就是關鍵幀,而meta是元資料,通過它們,我們才能知道視訊時間所對應的檔案偏移量。
  2. IIS不提供檔案位置偏移訪問介面。

如何是好呢?有條件要上,沒有條件創造條件也要上!對於Flv檔案,那當然是加上keyframe和meta就好,如何加法待會兒一一道來。對於檔案偏移訪問介面,有兩個思路:

  1. 替換掉IIS,使用支援偏移訪問的Flv嘛;
  2. 給IIS創造檔案偏移訪問的介面,iis extension、custom http handler和server side script都可以。

3. 實現

3.1 flv檔案的meta生成

上面提到,flv需要有meta資訊才能正確地被分析並根據時間獲取偏移量。有兩個工具可以補全meta資訊:

兩者都是命令列工具,也都有windows版本,下載了直接用就好。這裡簡單介紹一下用法:

flvtool2:

flvtool2 –U <input file> <output file>

 /// <summary>
        /// 處理flv實現新增matedata資訊
        /// </summary>
        /// <param name="toolpath">toolpath="/FilesList/Exe/VideoTools/flvtool2.exe"</param>
        /// <param name="filepath">視訊地址</param>
        public void flvtodrog(string toolpath, string filepath)
        {
            System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(toolpath);
            startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
            startInfo.UseShellExecute = false;
            startInfo.CreateNoWindow = false;
            startInfo.Arguments = " -U " + filepath;
            try
            {
                System.Diagnostics.Process.Start(startInfo);
            }
            catch (Exception e)
            {
                //
            }
        }


jamdi:

jamdi –i <input file> –o <output file>

如此,meta資訊就補全了。

3.2 使用IIS作為Web伺服器的方法

IIS是Windows預設Web伺服器,在Windows下不用它很難(雖然不少裝Apache的),而且尤其是當你的網站是ASP.net寫成的話。上面說過,IIS預設是不支援檔案偏移訪問的,我們要創造條件讓它能夠支援。這裡提供兩種方法:

3.2.1 Custom Http Handler

給IIS置入一個Custom Http Handler,讓它來處理所有對flv的請求,這就行了。簡略的步驟是:

1、使用任何一種CLR語言編寫一個Custom Http Handler,這個Handler接受兩個引數,第一個是flv檔名,第二個是start為引數名的偏移量,返回這個偏移量到檔案尾的所有資料。

2、將上面的Http Handler部署到IIS中。

3、在IIS中將所有對.flv檔案的訪問定向到這個Custom Http Handler上。

具體的步驟還是挺多,有人總結的很好,這裡不再重複了。步驟和原始碼在這裡

3.2.1 PHP代理

當IIS已經配置好了PHP的時候,使用PHP代理也不失為一種簡潔有效的方法了。這種方法的步驟非常簡單:

1、編寫一個php頁面,這個頁面接受兩個引數,第一個是檔名,第二個是start為引數名得偏移量,php讀取flv檔案並返回從偏移量到檔案尾的資料。

步驟相當簡單,而且這個解決方案几乎是可以橫跨所有Web Server和所有作業系統了,只要是能執行php的地方都可以應用。但是這種方法有兩個缺點:

  • PHP的效率可能會有問題;
  • 對flv檔案的位置有限制(這一點當你看了下面連線中的php程式碼以後就能瞭解)

具體的PHP程式碼見這裡

3.3 使用其它Web伺服器

其實下面這些伺服器都可以通過外掛實現這功能:

基本主流的Web Server都有支援了,不過基本也都要求在編譯時通過開關把這部分包含進去。

經過我的試驗,最新的Nginx 1.0 for windows這個版本預設已經開啟了這個開關,我們直接下載使用就好。既然標題上說的是“Windows服務環境下”,這裡就大概說一下如何配置:

  1. nginx伺服器下載最新的nginx 1.0 for windows,解壓以後放置在某個目錄下。
  2. nginx目前還沒有寫成windows服務,而只是應用程式。但是我們可以用這篇文章的辦法,將它轉變為一個服務。
  3. 在配置檔案conf/nginx.conf中,新增如下語句:

location ~ \.flv$ 

flv; 
}

這裡要注意,上面關於Nginx的參考文獻中,這個配置寫錯了,將“flv;”寫成了“.flv;”。

3.4 播放器支援

上面描述了服務端和視訊所要實現的部分,最後一步是要一個支援拖動的flv播放器。這裡推薦兩個很成熟的播放器吧,他們對於非商業應用都是免費開源,而商業應用的價格也不貴:

這兩個播放器都有很詳細的文件介紹如何支援所謂的流媒體(Flv streaming),也就是本文說的拖動。

4. 其它

本文介紹的解決方案,其實有很多種名字:

  • Flv(flash) Streaming
  • Pseudostreaming
  • Flv未緩衝視訊拖動

從第二個名字看來,它是一種“假”的流媒體。但是這種方案比起假設真的流媒體伺服器並不遜色,不用架設專業甚至昂貴的流媒體伺服器。也算是一種DIY的收穫吧。

其實FlowPlayer的網站上也有一篇非常詳細的綜述性質的文章,可以和本文互為參考。

另外,對於高清視訊,H264有一個比較統一的解決方案(IIS、Nginx、Apache、Lighttpd全機種制霸了),不用像flv這麼折騰,具體參考這裡

5. nginx安裝與配置

首先配置nginx服務支援flv模組功能

⑵安裝支援flv模組的nginx伺服器:

nginx下載地址http://download.csdn.net/detail/chenxiang199055/6204511

解壓至c:\nginx,執行nginx.exe(即nginx -c conf\nginx.conf),預設使用80埠(建議修改,資源中預設埠為8055),日誌見資料夾C:\nginx\logs
cd c:\
cd nginx
start nginx
nginx -s stop 快速退出
nginx -s quit 優雅退出
nginx -s reload 更換配置,啟動新的工作程序,優雅的關閉以往的工作程序
nginx -s reopen 重新開啟日誌檔案

開啟http://127.0.0.1:埠號/ 可以看到nginx歡迎頁,如果沒有看到檢查nginx配置

⑶nginx伺服器配置(nginx.conf檔案)

server

  {

listen       80;   //此埠號如果被佔用可以修改,建議修改

server_name  localhost;   

charset utf-8;

 location / {

            root   html; //此處指flv視訊所在資料夾,注意修改

            index  index.php index.html index.htm;

        }

  location ~ \.flv {

            flv;

   limit_rate_after 10m;

   limit_conn one 1;   

   limit_rate 85k;

        }

  }

使用location 將 .flv的檔案指向flv模組即可。

以上使用了limit_rate 是為了限速,當 flv視訊下載超過10M,則限速到85K只允許使用者開1個程序,也就是先快速快取可以播放,後面的慢慢下載。

⑷安裝支援flv拖放進度條的播放器

上面三步都是安裝支援nginx服務支援flv功能的,現在需要支援flv拖放進度條的播放器.

你需要有一個能夠播放Flv視訊的播放器,很顯然,它還需要能夠嵌入到網頁中。目前比較流行的,功能上也還比較完善的一個Flv播放器就是 JW FLV Media Player(也稱為 jwplayer)。它的網址是:

這個播放器支援視訊加入廣告和視訊節目單功能,

下載包裡面有很全的例項和使用方式,

將包中的player.swf(如果是帶有Viral外掛的,就是player-viral.swf)放到你的網站內,這就是用來提供視訊播放的播放器。至於包中其它的檔案,都可以不要。

接下來,將播放器嵌入到你的視訊播放網頁中:

直接嵌入,使用Object/Embed程式碼嵌入:

<embed  

        type="application/x-shockwave-flash"  

        id="player2"  

        name="player2"  

        src="player.swf"   

        width="328"   

        height="200"  

        allowscriptaccess="always"   

        allowfullscreen="true"  

        flashvars="file=http://192.168.40.135/test.flv&image=http://192.168.40.135/preview.jpg&autostart=false&type=http&streamer=start"   

    >  </embed>

file:"video.flv", // FLV視訊地址

type:"http",        // 資料型別,本文是基於http模式的,這個必須寫滴

image:"preview.jpg",// 開始播放之前的預覽圖

autostart:"false",  // 是否自動播放

streamer:"start",   // 引數為 start,這個引數用於傳遞給伺服器從特定的關鍵幀開始播放,nginx編譯了 flv 模組 所以是支援的。。

⑸新增關鍵幀

如果一個Flv視訊要能夠被拖到特定點播放,該Flv需要在其metadata中有關鍵幀的資訊。如果你的Flv視訊製作的時候沒有這些資訊,也是不能拖放播放的。可以使用yamdi來為你的視訊加上關鍵幀資訊 :

安裝:

1 [[email protected] ~]#wget http://sourceforge.net/projects/yamdi/files/yamdi/1.4/yamdi-1.4.tar.gz/download

2 [[email protected] ~]#tar zxvf yamdi-1.4.tar.gz

3 [[email protected] ~]#cd yamdi-1.4/

4 [[email protected] yamdi-1.4]#make && make install

使用方法:

yamdi -i source.flv -o dest.flv //原視訊 輸出視訊



相關推薦

windowsflv視訊網站進度隨意

網站中視訊都轉換成flv格式,奈何flv格式無法拖拽,此問題糾結了好久,最終得以解決。現將解決思路記錄下來,大多數源於網上找到的。 視訊拖拽滿足要求 1.播放器要支援 2.flv視訊要有關鍵幀和meta資訊 3.伺服器端要支援 總體而言分兩步: 一、視訊關鍵幀的處理;二、N

windowsIIS讓flv視訊網站進度隨意[C#]

在做一個視訊網站專案時,要求視訊能夠任意拖動播放,即使是沒有緩衝完也需要 網上查了下資料,主要需要3點 播放器要支援flv視訊要有關鍵幀和meta資訊伺服器端要支援 <script> flowplayer("player", "../f

基於opencv給視訊加上進度

platform: opencv 3.4.2 &vs 2017 #include "cv.h" #include "highgui.h" int g_slider_position = 0; CvCapture * g_capture = NULL; //再拖動

openCV 播放視訊進度

#include "opencv2/core.hpp" #include "opencv2/highgui.hpp" #include "opencv2/imgproc.hpp" #include "

我的Android進階之旅------>Android如何通過自定義SeekBar來實現視訊播放進度

首先來看一下效果圖,如下所示:其中進度條如下:接下來說一說我的思路,上面的進度拖動條有自定義的Thumb,在Thumb正上方有一個PopupWindow視窗,窗口裡面顯示當前的播放時間。在SeekBar右邊有一個文字框顯示當前播放時間/總時間。step1、先來看一看Popup

Linuxc實現簡易進度

#進度條:顧名思義就是看計算機處理任務時的速度,完成度,反正過程啥的。就是這樣子 我們實現一個簡易版的 我們需要的知識make命令編譯:因為方便。不瞭解make指令的先看看make指令介紹 我們下

windows安裝TensorFlow時,進度一直不動,最後失敗的解決方案

如何在window上安裝TensorFlow這裡我就不贅述了,太多的教程了,在我安裝的時候,老是出現這麼一個問題,明明已經開始下載了,突然進度條不動了,然後一堆亂七八糟的報錯。 著實有點讓人無語了,看其他的人教程明明都可以的。於是我在想是不是網路的原因,是不是Ten

android 視訊錄製進度(分段錄製,回滾刪除,類似美拍錄製)

最近因為公司啟動微視訊專案,負責視訊錄製及視訊編輯這塊工作,而首先視訊錄製這塊需要支援分段錄製,和回滾刪除功能。 所以就做了這麼繼承View自定義了這個一個進度條小demo,有待完善及優化。 效果圖先出場 因為比較簡單加上有註釋,就不再多囉嗦,直接上程式碼

基於vue2.0實現音樂/視訊播放進度元件的思路及具體實現方法+程式碼解釋

基於vue2.0實現音樂/視訊播放進度條元件的方法及程式碼解釋 需求分析: ①:進度條隨著歌曲的播放延長,歌曲播放完時長度等於黑色總進度條長度;時間實時更新。 ②:當滑動按鈕時,實時更新播放時間,橙色進度條長度也會隨著按鈕的滑動而改變,當滑動結束時,橙色區域停留在滑動結束的

Linuxc語言實現進度

顏色的處理 要想把進度條加上顏色,我們只需要在需要顯示顏色的部分輸入顏色編號即可,但是要在最後用\033[0m關閉所有屬性,不然程式執行後會在執行後的後續文字中也變為我們之前所設定的顏色。 通過控制符即可設定我們需要的顏色: \033[30m– \033[

微信小程式音樂播放器開發(進度拽)

前言  這篇文章上一版本是用audio元件開發的播放器,隨後反應音訊載入速度慢的問題 又用小程式內建的背景音樂播放的方法寫了一遍,邏輯是一樣的邏輯,希望對大家有所幫助! <view class='audiosBox'> <view c

windows安裝MongoDB進度不動

windows 下安裝MongoDB, 在  Installing MongoDB Compass...(this may take a few minutes) 一步,會停留很長時間,點選取消可能也會取消不了。 不要心急,耐心等待即可,本人等待了將近半個小時,是不是很誇

模仿微視視訊錄製、支援按錄製擡起暫停以及斷點進度(基於javacv)

/* * Copyright (C) 2009,2010,2011,2012,2013 Samuel Audet * * This file is part of JavaCV. * * JavaCV is free software: you can redistribute it and/or

網站加載進度

www nbsp png 進行 bsp 頁面加載 判斷 ade 隱藏 https://preloaders.net/ 判斷狀態進行操作隱藏頁面加載gif https://loading.io/ autoprefixer.github.io 自動形成兼容

自制進度在python3PyCharm中運行或在控制臺按照目錄運行

div font pri counter log blog sca -s for import timescale = 50print("執行開始".center(scale//2,"-"))start = time.perf_counter()for i in range

javascript使用ajax載文件進度實現

javascript使用ajax下載文件代碼: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="te

Linux實現彩色進度程式

程式碼: #include <stdio.h> #include <unistd.h> #include <string.h> int main() { int i = 0; char bar[101]; const char *la

Linux實現進度程式. 通過makefile進行編譯. 建議自主完成一個彩色的進度.

Linux下用C語言完成一個彩色進度條 1.建一個Makefile檔案 2.vim Makefile test:test.c

視訊畫中畫效果,進度可以seek到相應視訊幀顯示

在視訊開發中,我們常常看到這樣的效果,拖動進度條時,或是在進度條上方或是在螢幕中間,顯示拖動進度條位置時刻的某一幀畫面。 這個需求,如果是你,你會如何做? 通常一個需求,不僅要考慮實現,還有考慮一些是否有效能上影響。 下面我想到的4個方案: 1、在拖動過程中,可以通過TextureVi

Android進度、自動提示框、拉框動態資料載入

1.進度條實現 佈局檔案: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"