php+flv

Jun 23, 2016 pm 02:37 PM

flv+php视频网站制作攻略

1#

发表于 2008-11-14 19:55 | 只看该作者 | 倒序看帖 | 打印

flv视频网站制作 使用Flex和PHP创建自己的视频应用英文原文:Creating MyTube with Flex and PHP
原文地址:
http://www.onlamp.com/pub/a/php/ ... h-flex-and-php.html
原文作者:Jack Herrington

随着宽带的普及、硬盘空间的价格持续降低以及Adobe® Flash® Player 和 Flash Video的实用性,视频分享在互联网上疯狂流行是不足为奇的。像Google video 和 YouTube 这样的站点是领头羊,而现在已经到处都是小型的视频分享站点了。那么,如何才能加入到潮流中去呢?如何利用像PHP, Flash和Adobe Flex? 等技术来创建自己的视频分享网站?行动起来吧,它比你想象的要容易得多。

本文将告诉你如何创建网站的PHP部分以及如何使用Flex框架创建一个视频播放器。要创建一个YouTube的简单版本(我们可以称它为MyTube),你需要有一些适当的工具。

在服务器端,你需要PHP 和 MySQL。MySQL是用来存储有关视频的数据的(比如视频的文件名,缩略图,缩略图的高度和宽度,标题和描述)。PHP将完成格式化页面的工作,包括HTML和XML页面,这取决于你想要怎么做。

你还需要一个开源的软件:ffmpeg,它可以将用户上传的任何格式的视频文件转换成Flash Video文件(FLV)。当你向用户展示一个可用的视频列表时,这个 ffmpeg 软件还可以生成视频中某一帧的缩略图。毫无疑问,在视频分享的世界中ffmpeg 会是你最好的助手。它是一个功能强大、易于使用而且文档齐全的极为优秀的软件。

在客户端,有几种不同的用户界面可供选择。第一种就是类似于YouTube的HTML/Flash混合式的用户界面,另外一种就是完全基于Flash的用 户界面。这里我选择了Flex框架来创建一个Flash程序,这个程序首先播放视频,然后会列出一个可用视频的列表并提供导航。

创建PHP后台

创建后台的程序之前,你必须先在MySQL建立一些数据库模式(schema)。首先,创建一个数据库,你可以使用mysqladmin命令行: 复制内容到剪贴板 代码:mysqladmin create movies
完成之后,将模式加载到数据库,模式文件内容如下:

movies.sql 复制内容到剪贴板 代码:DROP TABLE IF EXISTS movies;
CREATE TABLE movies (
movieId INTEGER NOT NULL AUTO_INCREMENT,
title VARCHAR( 255 ),
source VARCHAR( 255 ),
thumb VARCHAR( 255 ),
width INTEGER,
height INTEGER,
PRIMARY KEY( movieId )
);
要向数据库中添加数据,你需要开发一个HTML上传页面,它可以上传视频,将视频转换成Flash Video,获得一个缩略图并将这些信息添加到数据库中。



创建上传页面
事实上,创建一个上传视频的HTML页很简单,如下:
addmovie.html 复制内容到剪贴板 代码:







Title
Movie





这个页面的表单提交到 upload.php 页,upload.php 会处理视频,抓取缩略图并将数据添加到数据库中。页面代码如下:
upload.php 复制内容到剪贴板 代码:

require "DB.php";
  
function converttoflv( $in, $out )
{
  unlink( $out );
  $cmd = "ffmpeg -v 0 -i $in -ar 11025 $out 2>&1";
  $fh = popen( $cmd, "r" );
  while( fgets( $fh ) ) { }
  pclose( $fh );
}
  
function getthumbnail( $in, $out )
{
  unlink( $out );
  $cmd = "ffmpeg -i $in -pix_fmt rgb24 -vframes 1 -s 300x200 $out 2>&1";
  $fh = popen( $cmd, "r" );
  while( fgets( $fh ) ) { }
  pclose( $fh );
}
  
function flv_import( $upfile, $fname, $title )
{
  $fname = preg_replace( '/\..*$/', '', basename( $fname ) );
  $flvpath = "$fname.flv";
  $thumbpath = "$fname.gif";
  
  converttoflv( $upfile, "movies\\$flvpath" );
  getthumbnail( $upfile, "movies\\$thumbpath" );
  
  $dsn = 'mysql://root@localhost/movies';
  $db =& DB::connect( $dsn );
  if ( PEAR::isError( $db ) ) { die($db->getMessage()); }
  
  $sth = $db->prepare( 'INSERT INTO movies VALUES ( 0, ?, ?, ?, ?, ? )' );
  $db->execute( $sth, array( $title, $flvpath, $thumbpath, 300, 200 ) );
}
  
flv_import( $_FILES['movie']['tmp_name'], $_FILES['movie']['name'], $_POST['title'] );
?>
File sucessfully uploaded

函数flv_import()是脚本代码的核心部分,它调用了converttoflv() 函数和 getthumbnail()函数来将视频转换成Flash Video文件和创建缩略图。然后它向数据库中添加了有关视频的一些数据。有关FLV和缩略图的功能都使用了 ffmpeg 中的命令行来处理视频。
当我打开addmovie.html 页面的时候,我做了一下截图,见图1.


图1.上传视频的页面

现在你就可以点击 Upload 按钮上传视频到服务器进行处理了。
upload.php 页面中的脚本只是一些很基础的代码。如果向将其投入使用,你需要添加一些错误验证代码。这些脚本最大的问题就是处理较大的视频文件的能力。较大的视频文件需要转换很长时间,用户也需要等待很长时间才行。
为了能够支持大的视频文件(比如长于10秒钟的视频),我建议你简单地将视频复制到一个文件夹中,然后通知用户该视频稍后将会出现在网站上。然后你可以编写一段脚本来处理该文件夹中的视频。
这里我觉得有必要说明一下为什么要把视频转换成Flash Video。当然,在Flash Player中我需要使用Flash Video来观看视频。但是不只是那样,如果我不进行转换的话就要显示每个视频的播放器是什么,而且还要帮助用户找到并安装适用于他们系统的播放器。这将 需要大量的工作。将所有的视频转换成Flash Video的最大优点??同时也是使用Flex编写的Flash Player的最大优点??就是它几乎可以在任何地方运行。
下一步就是创建一个类似YouTube的简单的 HTML/Flash 界面。



创建 HTML/Flash 界面
在Adobe Flex Builder? 2创建一个新的Flex 工程,然后创建一个Flash视频,这个视频通过给定的URL找到视频并播放。我们将这个Flex应用程序文件命名为simplemovie.mxml,代码如下:
simplemovie.mxml 复制内容到剪贴板 代码:



       source="{Application.application.parameters.movie}" />
  
   
  



这个简单的Flex程序包括两部分:一个用来播放视频的VideoDisplay组件以及一个Play 按钮,当视频播放完毕时用户可以点击按钮重新播放。
VideoDisplay 组件有一个 source 属性,它包含了视频FLV文件的URL地址。在这里,它的值是一个程序变量,这个变量是HTML中的标签的FlashVars属性所提供的。
使用Flex Builder将simplemovie.mxml编译成simplemovie.swf文件然后将其从bin文件夹中移动到PHP文件目录中。下面我们将创建一个嵌入了这个视频的PHP页面,该页面代码如下:
simptest.php 复制内容到剪贴板 代码:
require "DB.php";
  
$moviebase = 'http://localhost:8080/movies/';
  
$dsn = 'mysql://root@localhost/movies';
$db =& DB::connect( $dsn );
if ( PEAR::isError( $db ) ) { die($db->getMessage()); }
  
$source = null;
$movieId = 1;
if ( array_key_exists( 'movie', $_GET ) )
  $movieId = $_GET['movie'];
  
$movies = array();
$res = $db->query( 'SELECT movieId, source, title FROM movies' );
while( $row = $res->fetchrow( ) ) {
  $movies []= $row;
  if ( $row[0] == $movieId )
    $source = $row[1];
}
  
if ( $source == null )
    $source = $movies[0][1];
?>




  height="335"
  codebase="http://fpdownload.macromedia.com/get/flashplayer/current/
swflash.cab">



  width="400" height="335" play="true"
  loop="false"
  quality="high"
  flashVars="movie="
  type="application/x-shockwave-flash"
  pluginspage="http://www.adobe.com/go/getflashplayer">



foreach( $movies as $movie ) {
?>


}
?>



在上面的代码中,一开始是连接到数据库并获取视频列表。然后它就开始查找是否有与URL中ID匹配的视频ID,如果有匹配的视频ID,它就会将这个ID赋值给movie变量并通过flashVars参数传送到simplemovie.swf文件。
接下来,在HTML代码中创建了标签用来嵌入simplemovie.swf,标签中也提供了视频的正确URL地址。然后又创建了一个列表列出了所有可用的视 频,这个列表中的每一项都提供了它们对应视频的正确ID并链接到了本页。
在浏览器中运行这个页面的结果如图2:


图2.简单的视频播放器和视频列表

当我打开页面的时候第一个视频开始播放。当我选择右边列表中的某个视频的时候,页面就会重新载入并播放选中的视频。
是不是很简单?一个Flex文件,一个PHP文件再加上后台的一点数据库操作,哇!一个视频分享网站出现了!
接下来我们将在Flex中做一些工作来增强用户体验。



Flex界面,第一部分
如果你想让Flex播放视频,你必须向Flex程序提供视频列表。最简便的方法就是通过XML。所以,现在我们要返回PHP的部分,编写一个可以将数据库中的视频列表抽取到XML文件的页面。movies.php就实现了这个功能,代码如下:
movies.php 复制内容到剪贴板 代码:
require "DB.php";
  
$moviebase = 'http://localhost:8080/movies/';
  
header( 'content-type: text/xml' );
  
$dsn = 'mysql://root@localhost/movies';
$db =& DB::connect( $dsn );
if ( PEAR::isError( $db ) ) { die($db->getMessage()); }
?>

$res = $db->query( 'SELECT title, source, thumb, width, height FROM movies' );
while( $row = $res->fetchrow( ) ) {
?>
      thumb="" width=""
   height="" />
}
?>

你可以通过命令行运行它然后查看生成的XML,也可以在浏览器中打开这个页面然后你就可以看到以树形方式显示的XML,见图3:


图3.视频的XML列表

有了这个XML列表,我们就可以创建一个扩展自simplemovie.mxml的Flex程序,代码如下:
mytube1.mxml 复制内容到剪贴板 代码:


  

  
<script> <br> import mx.rpc.events.ResultEvent; <br> import mx.controls.VideoDisplay; <br> import mx.controls.List; <br> import mx.rpc.http.HTTPService; <br> import mx.collections.ArrayCollection; <br>   <br> [Bindable] <br> private var movies : ArrayCollection = new ArrayCollection(); <br>   <br> public function onGetMovies( event : ResultEvent ) : void <br> { <br>   var firstMovie : String = event.result.movies.movie[0].source.toString(); <br>   videoPlayer.source = firstMovie; <br>   <br>   movies = event.result.movies.movie; <br>   movieList.selectedIndex = 0; <br> } <br>   <br> public function onPrevious() : void <br> { <br>   if ( movieList.selectedIndex == 0 ) <br>     movieList.selectedIndex = movies.length - 1; <br>   else <br>     movieList.selectedIndex -= 1; <br>   videoPlayer.source = this.movieList.selectedItem.source.toString(); <br> } <br>   <br> public function onPlay() : void <br> { <br>   videoPlayer.source = this.movieList.selectedItem.source.toString(); <br>   videoPlayer.play(); <br> } <br>   <br> public function onNext() : void <br> { <br>   if ( movieList.selectedIndex >= ( movies.length - 1 ) ) <br>     movieList.selectedIndex = 0; <br>   else <br>     movieList.selectedIndex += 1; <br>   videoPlayer.source = this.movieList.selectedItem.source.toString(); <br> } <br>   <br> public function onChange() : void <br> { <br>   videoPlayer.source = this.movieList.selectedItem.source.toString(); <br> } <br> </script>
  

  
   
   
      
      
      
   

   

          dataProvider="{movies}"
      change="onChange()"
      labelField="title">


明显的变化就是页面上半部分添加了很多ActionScript代码,它们用来管理界面。这些代码首先在onGetMovies()使用 HTTPService从movies.php中读取XML。当HTTPService类检测到XML时会立刻返回一个XML文档对象模型(DOM),然 后我们就可以使用这个DOM来读取第一个视频并播放它。函数onGetMovies()还设定了一个movies变量来存储列表框中要显示的视频。 ActionScript代码中的其它方法处理界面可能触发的不同事件,例如用户点击了视频列表、点击了“上一个”或“下一个”按钮等等。
最下面的代码是一些组成用户界面的Flex组件。其中有一些按钮??左箭头和右箭头??来切换到下一个或上一个视频。在VideoDisplay的右边有一个视频列表,在这里该列表只是列出了视频的名字。
使用Flex编译并运行程序,结果如图4:


图4.Flex用户界面的第一个版本

现在我们可以使用右边的列表来选择视频,或者通过按下左/右按钮在视频之间切换。这个程序已经相当不错了,不过我们的缩略图在哪里使用了呢?



Flex 界面,第二部分??添加了缩略图
要在列表中使用缩略图,你需要对列表做一下更改使其可以同时显示缩略图及其标题。幸运的是在Flex中实现这一点很容易。首先我们要修改标签为其添加一个itemRenderer,代码如下:
mytube2.mxml 复制内容到剪贴板 代码:
...
       dataProvider="{movies}"
    change="onChange()"
    itemRenderer="MovieItem">
...
这个itemRenderer是一个由你自己创建的MXML组件,而且它的文件名必须是MovieItem。你可以通过选择菜单中的 New > MXML Component 来创建文件,然后将下面的代码添加进去:
MovieItem.mxml 复制内容到剪贴板 代码:


        height="{data.height/3}" rotation="5" left="10" top="0" />
   

我使用了Canvas容器,这样我就可以按照自己的想法定位其中的组件了,当然,你可以使用最适合你的布局的容器。然后,我使用了一 个标签用来加载图像并使用了一个
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

會話如何劫持工作,如何在PHP中減輕它? 會話如何劫持工作,如何在PHP中減輕它? Apr 06, 2025 am 12:02 AM

會話劫持可以通過以下步驟實現:1.獲取會話ID,2.使用會話ID,3.保持會話活躍。在PHP中防範會話劫持的方法包括:1.使用session_regenerate_id()函數重新生成會話ID,2.通過數據庫存儲會話數據,3.確保所有會話數據通過HTTPS傳輸。

描述紮實的原則及其如何應用於PHP的開發。 描述紮實的原則及其如何應用於PHP的開發。 Apr 03, 2025 am 12:04 AM

SOLID原則在PHP開發中的應用包括:1.單一職責原則(SRP):每個類只負責一個功能。 2.開閉原則(OCP):通過擴展而非修改實現變化。 3.里氏替換原則(LSP):子類可替換基類而不影響程序正確性。 4.接口隔離原則(ISP):使用細粒度接口避免依賴不使用的方法。 5.依賴倒置原則(DIP):高低層次模塊都依賴於抽象,通過依賴注入實現。

PHP 8.1中的枚舉(枚舉)是什麼? PHP 8.1中的枚舉(枚舉)是什麼? Apr 03, 2025 am 12:05 AM

PHP8.1中的枚舉功能通過定義命名常量增強了代碼的清晰度和類型安全性。 1)枚舉可以是整數、字符串或對象,提高了代碼可讀性和類型安全性。 2)枚舉基於類,支持面向對象特性,如遍歷和反射。 3)枚舉可用於比較和賦值,確保類型安全。 4)枚舉支持添加方法,實現複雜邏輯。 5)嚴格類型檢查和錯誤處理可避免常見錯誤。 6)枚舉減少魔法值,提升可維護性,但需注意性能優化。

在PHPStorm中如何進行CLI模式的調試? 在PHPStorm中如何進行CLI模式的調試? Apr 01, 2025 pm 02:57 PM

在PHPStorm中如何進行CLI模式的調試?在使用PHPStorm進行開發時,有時我們需要在命令行界面(CLI)模式下調試PHP�...

如何在系統重啟後自動設置unixsocket的權限? 如何在系統重啟後自動設置unixsocket的權限? Mar 31, 2025 pm 11:54 PM

如何在系統重啟後自動設置unixsocket的權限每次系統重啟後,我們都需要執行以下命令來修改unixsocket的權限:sudo...

解釋PHP中的晚期靜態綁定(靜態::)。 解釋PHP中的晚期靜態綁定(靜態::)。 Apr 03, 2025 am 12:04 AM

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

See all articles