自动转换flv文件

在线转化.

谁有 把其他的视频文件格式的视频,经过上传自动转化FLV格式的一种插件.提供编程接口.给我一份.

类似新浪网播客上传视频的一样. (还有上传是的哪个效果,进度条如何作的?)

或者给我个参考地址什 ...
环境:redhat as4

1。首先获取ffmpeg

很多人找不到怎么下载,其实之前ffmpeg可以通过cvs下载,不过最近他已经换成了更加强大的svn

如何使用SVN我这里不再介绍,网上还有大量的安装和使用的文章可以借鉴,这里简单罗列几个SVN辅助的软件:

SubVersion,从 http://subversion.tigris.org/ 下载,支持linux,我们这里就装这个

TortoiseSVN,从 http://tortoisesvn.tigris.org/ 下载,是很不错的SVN客户端程序,为windows外壳程序集成到windows资源管理器和文件管理系统的Subversion客户端,用起来很方便,commit动作变得就像Winrar右键压缩一样方便。


ok,那我们先装subversion,记住最好之前装过apr和apr-util,在apache.org网站能下到

wget http://subversion.tigris.org/downloads/subversion-1.3.2.tar.gz
tar zvxf subversion-1.3.2.tar.gz
cd subversion-1.3.2
./configure --with-apr=/usr/local/apr-httpd --with-apr-util=/usr/local/apr-util-httpd/
make
make install


到此,我们就可以通过svn命令获取最新的ffmpeg了

svn checkout svn://svn.mplayerhq.hu/ffmpeg/trunk ffmpeg

你会发现在你所在的目录,自动出现一个ffmpeg的目录,就是你下载的源代码。


我们还不能这么快编译ffmpeg,应该如果要让ffmpeg支持更多格式的转换,还需做一些前期工作

2.支持mp3,linux当然是lame,下载解压

cd lame-3.96.1
./configure --enable-shared --prefix=/usr
这里推荐尽量装在/usr下,默认是装在/usr/local下。这样ffmpeg编译都能顺利的找到库文件


3.支持Ogg Vorbis:
as4自带相应的rpm包,你可以安装一下如下rpm包
libvorbis, libvorbis-devel,libogg, libogg-devel


4.支持xvid x264,现在最流行的两种高质量的压缩格式
xvid的编译安装
wget http://downloads.xvid.org/downloads/xvidcore-1.1.0.tar.gz
tar zvxf xvidcore-1.1.0.tar.gz
./configure --prefix=/usr
make
make install

x264的获取同样是采用svn方式,看来svn取代cvs不远了
svn co svn://svn.videolan.org/x264/trunk x264
cd x264
./configure --prefix=/usr --enable-shared
make
make install


5.AC3和dts编码的支持
as4系统似乎已经支持ac3编码,编译的时候只要加--enable-a52 --enable-gpl参数就行

libdts编译参数
./configure --prefix=/usr
make
make install


6.mpg4 aac格式支持,由于服务器还针对手机用户服务,所以,类似aac,mpg4铃声格式的支持,我们也得做。这里我们安装faad2和faac就行
下载请到 http://www.audiocoding.com/modules/mydownloads/

FAAD2的编译
cd faad2
autoreconf -vif
./configure --prefix=/usr --with-mp4v2 --enable-shared
make
make install

faac的编译
cd faac
chmod +x bootstrap
./bootstrap
./configure --prefix=/usr --with-mp4v2 --enable-shared
make
make install


7.支持3gp格式,这也是现在好多手机支持的格式,因为手机用户是我们的主要用户,所以也得支持编译

编译的时候加上--enable-amr_nb --enable-amr_wb参数就行,根据编译系统的提示,所以我们得下载一

些编译3gp所需得文件。

wget http://www.3gpp.org/ftp/Specs/ar ... 6.204/26204-510.zip
解压以后把里面的文件都拷贝到libavcodec/amrwb_float

wget http://www.3gpp.org/ftp/Specs/ar ... 6.104/26104-510.zip
解压以后把里面的文件都拷贝到libavcodec/amr_float


好了,基本ffmpeg支持的格式,我们基本都做好前期准备了,下面是ffmpeg的编译


./configure --prefix=/usr --enable-gpl --enable-shared --enable-mp3lame --enable-amr_nb --enable-amr_wb --enable-amr_if2 --enable-libogg --enable-vorbis --enable-xvid --enable-a52 --enable-a52bin --enable-faadbin --enable-dts --enable-pp --enable-faad --enable-faac --enable-x264 --enable-pthreads --disable-ffserver --disable-ffplay
make
make install

补充1:
关于3gp的编译,如果大家要编译--enable-amr_nb-fixed,那就不能跟--enable-amr_nb同时编译,我不大清楚这两者到底有什么区别,似乎fixed是修正版,管他呢,编译的方法:
wget http://www.3gpp.org/ftp/Specs/ar ... 6.073/26073-510.zip
解压以后把里面的文件都拷贝到libavcodec/amr目录下

修改libavcodec/amr/makefile 找到CFLAGS = -Wall -pedantic-errors -I. $(CFLAGS_$(MODE)) -D$(VAD) 换成CFLAGS = -Wall -I. $(CFLAGS_$(MODE)) -D$(VAD) -DMMS_IO

整体编译参数就是
./configure --prefix=/usr --enable-gpl --enable-shared --enable-mp3lame --enable-amr_nb-fixed --enable-amr_wb --enable-amr_if2 --enable-libogg --enable-vorbis --enable-xvid --enable-a52 --enable-a52bin --enable-dts --enable-pp --enable-faad --enable-faadbin --enable-faac --enable-x264 --enable-pthreads --disable-ffserver --disable-ffplay
make
make install

补充2:
有朋友说在当在cpu是x86的情况下,不能编译过去,我这里没发生过这情况,如果你真编译不过去,可以试着加上cpu=cpu

ok,一个强大的ffmpeg编译好了,不过目前管方的ffmpeg还不支持wma9和rmvb,不过网上有很多解决方法,大家去自己找找。

================================================

关于进度条的问题,我一直都无法解决.按道理新浪也不可能100%获取真实进度的吧?如果模拟的话就一大堆了,
我这里提供一UPU的类用的SOCKET协议.
[php]
<?php
/**
* UGiA PHP UPLOADER V0.2
*
* Copyright 2005 legend < legendsky@hotmail.com>
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at
* your option) any later version.

* This library is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.

* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*
* @link http://www.ugia.cn, http://sourceforge.net/projects/upu
* @copyright Copyright: 2004-2005 UGiA.CN.
* @author legend < legendsky@hotmail.com>
* @package UPU
* @version $Id: upu.class.php,v 1.2 2005/09/22 08:03:22 legend9 Exp $
*/

define('UPU_CLIENT_CHARSET', 'utf-8');
define('UPU_TEMP_PATH', '/upload/upu/temp/');
define('UPU_SAVE_PATH', '/upload/upu/files/');

define('UPU_SOCKET_ENDTAG', "/x2d/x2d/x0d/x0a");
define('UPU_CRLF', "/x0d/x0a");

define('UPU_SOCKET_CREATE_ERROR', "Socket创建失败");
define('UPU_SOCKET_BIND_ERROR', "端口绑定失败");
define('UPU_SOCKET_LISTEN_ERROR', "端口监听失败");
define('UPU_SOKET_ACCEPT_ERROR', "无法接受客户端请求");
define('UPU_CREATE_TEMP_FILE_ERROR', "创建临时文件失败");
define('UPU_FILE_TO_LARGE', "文件超过指定大小");
define('UPU_GET_TMP_FILE_SIZE_ERROR', "获取临时文件大小失败");
define('UPU_READ_TMP_FILE_ERROR', "打开临时文件失败");
define('UPU_WRITE_NEW_FILE_ERRPR', "创建新文件失败");

class UPU
{
var $sPort = 1024;
var $ePort = 65536;

var $savePath = UPU_SAVE_PATH;
var $tmpPath = UPU_TEMP_PATH;

var $allowExt = "*";
var $maxFileSize = 0;

var $srvPort;
var $ipAddr;
var $processID;
var $bufferSize = 1024;

var $Boundary;
var $ContentLength = 0;
var $fileSize = 0;
var $fileInfo = array();
var $formData = array();

var $errorCode = 0;

function UPU ()
{
$this->srvPort = mt_rand($this->sPort, $this->ePort);
$this->ipAddr = $_SERVER['SERVER_NAME'];
}

function processRequest()
{
$uSocket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($uSocket < 0) return -101;

$uBind = socket_bind($uSocket, $this->ipAddr, $this->srvPort);
if ($uBind < 0) return -102;

//socket_set_blocking($uSocket);

$uListen = socket_listen($uSocket, 5);
if ($uListen < 0) return -103;

$this->writeContents($this->tmpPath . $this->processID . ".srv", $this->ipAddr.":".$this->srvPort);

$uRequest = socket_accept($uSocket);
if ($uRequest < 0) return -104;

$httpResponse = "HTTP/1.1 200 OK/r/n";
$httpResponse .= "Content-Length: 2/r/n";
$httpResponse .= "Content-Type: text/html/r/n";
$httpResponse .= "Last-Modified: " . date("r") . "/r/n";
$httpResponse .= "Accept-Ranges: bytes/r/n";
$httpResponse .= "X-Powered-By: UPU/r/n";
$httpResponse .= "Date: " . date("r") . "/r/n/r/n";

socket_write($uRequest, $httpResponse);

$neededbuffer = true;
$BufferPond = array();

$tmpFileName = $this->tmpPath . $this->processID . ".dat";

if(!$fp = fopen ($tmpFileName, "wb")) return -105;

$dataRead = 0;
while ($flag = socket_recv($uRequest, $buffer, $this->bufferSize, 0))
{

fwrite($fp, $buffer);

// buffer pond
array_push ($BufferPond, $buffer);
if (count($BufferPond) == 3)
{
$dataRead += strlen($BufferPond[0]);
array_shift($BufferPond);
}

$Contents = join("", $BufferPond);

// boundary
if (!$this->Boundary)
{
if (preg_match("/Content-Type: multipart//form-data; boundary=[-]{27}(/S+)/i", $Contents, $matchesB))
$this->Boundary = $matchesB[1];
}

// content length
if (!$this->ContentLength)
{
if (preg_match("/Content-Length: (/d+)/r/n/i", $Contents, $matchesL))
{
$this->ContentLength = $matchesL[1];

$this->writeContents($this->tmpPath . $this->processID . ".con", $this->ContentLength);

if ($this->maxFileSize && $this->ContentLength > $$maxFileSize * 1024 * 1024)
{
return -106;
break;
}
}
}

// parse
$boundary = str_repeat("-", 29) . $this->Boundary;
if (strpos($Contents, $boundary))
{
preg_match_all("/$boundary/r/nContent-Disposition: form-data; name=/"([^/"]*)/"(; filename=/"([^/"]*)/"/r/nContent-Type: (/S+))?/r/n/i", $Contents, $matchesF, PREG_OFFSET_CAPTURE);

//print_r($matchesF);

if ($matchesF)
{
for ($i = 0; $i < count($matchesF[0]); $i ++)
{
$formIndex = $this->checkFormName($matchesF[1][$i][0], $this->formData);
if ( $formIndex === -1)
{
$this->formData[] = array (
'name' => $matchesF[1][$i][0],
'type' => $matchesF[3][$i] ? "file" : "form",
'filename' => $matchesF[3][$i][0],
'content-type' => $matchesF[4][$i][0],
'offset' => $dataRead + $matchesF[0][$i][1],
'full' => $matchesF[0][$i][0]
);

if ($matchesF[3][$i])
{
$clientArray = "new Array(/"" . $matchesF[1][$i][0] . "/",/"" . $this->getBaseName($matchesF[3][$i][0]) . "/",/"" . $matchesF[4][$i][0] . "/")";
$this->writeContents($this->tmpPath . $this->processID . ".inf", $clientArray);
}
}
}
}
else
{
break;
}
}

if ($flag < 0)
{
echo socket_strerror(socket_last_error($uSocket));
break;
}
elseif ($flag == 0)
{
echo "client disconnected";
break;
}

// end of request ?
$eof = substr($buffer, -4);
$las = substr($buffer, $this->bufferSize - 4, 4);
if ($eof == UPU_SOCKET_ENDTAG || (strlen($eof) < 4 && ($las{strlen($eof) -1} == "/x0a" || $las{strlen($eof) -1} == "/x00")))
{
break;
}

$loopTime ++;
}

fclose($fp);

$msg = "ok";
socket_write($uRequest, $msg, strlen($msg));
socket_close($uRequest);
socket_close($uSocket);

//print_r($this->fileInfo);
//print_r($this->formData);

// temp file size
if (!$this->fileSize = @filesize($tmpFileName))
{
return -108;
}

// temp file read handle
if (!$readHandle = fopen($tmpFileName, "rb"))
{
return -109;
}

foreach ($this->formData as $k => $v)
{
fseek($readHandle, $v['offset'] + strlen($v['full']) + 2);
$eOffset = $k + 1 == count($this->formData)? $this->fileSize - 35 - strlen($this->Boundary) : $this->formData[$k + 1]['offset'] - 2;
$this->formData[$k]['filesize'] = $eOffset - $v['offset'] - strlen($v['full']) - 2;

if ($v['type'] == "file")
{
$extension = $this->getExtension($v['filename']);
$savepath = $this->savePath . md5($this->processID . "-" . $k) . "." . $extension;
$writeHandle = fopen($savepath, "wb");
fwrite($writeHandle, @fread($readHandle,$this->formData[$k]['filesize']));
fclose($writeHandle);
$this->formData[$k]['ext'] = $extension;
$this->formData[$k]['path'] = $savepath;
}
else
{
$this->formData[$k]['value'] = @fread($readHandle, $this->formData[$k]['filesize']);
}
}

fclose($readHandle);

$form = array();
foreach ($this->formData as $k => $v)
{
if ($v['type'] == "file")
{
$form[$v['name']] = array(
'filename' => $this->getBaseName($v['filename']),
'extension' => $v['ext'],
'clientpath' => $v['filename'],
'savepath' => realpath($v['path']),
'filetype' => $v['content-type'],
'filesize' => $v['filesize'],
'extension' => $v['ext']
);
}
else
{
$form[$v['name']] = $v['value'];
}
}

$this->writeContents($this->tmpPath . $this->processID . ".frm", serialize($form));

sleep(60);
unlink($this->tmpPath . $this->processID . ".inf");
unlink($this->tmpPath . $this->processID . ".dat");
unlink($this->tmpPath . $this->processID . ".con");
unlink($this->tmpPath . $this->processID . ".srv");
}

// get socket server ip address and port
function getSrvAddr()
{
return $this->getContents($this->tmpPath . $this->processID . ".srv");
}

// get Content Length
function getContentLength()
{
return $this->getContents($this->tmpPath . $this->processID . ".con");
}

// get file info
function getFileInfo()
{
return $this->getContents($this->tmpPath . $this->processID . ".inf");
}
// get uploaded file length
function getUploadedLength()
{
if (file_exists($this->tmpPath . $this->processID . ".dat"))
{
return filesize($this->tmpPath . $this->processID . ".dat");
}

return 0;
}

function getFormData()
{
if (file_exists($this->tmpPath . $this->processID . ".frm"))
{
return $this->getContents($this->tmpPath . $this->processID . ".frm");
}

return 0;
}


function writeContents($filename, $contents)
{
$fwriteHandle = @fopen($filename, "w");
if (!is_resource($fwriteHandle))
{
return false;
}

fwrite($fwriteHandle, $contents);
fclose($fwriteHandle);

return true;
}


function getContents($filename)
{
if (file_exists($filename))
{
$freadHandle = @fopen($filename, "r");
if (!is_resource($freadHandle))
{
return false;
}

$contents = fread($freadHandle, filesize($filename));
fclose($freadHandle);

return $contents;
}

return false;
}


function getBaseName($path)
{
$path = str_replace("//", "/", $path);
return substr($path, strrpos($path, "/") + 1);
}

function getExtension($filename)
{
return substr(strrchr($filename, '.'), 1);
}

function checkFormName($formName, $arr)
{
foreach ($arr as $k => $v)
{
if ($formName == $v['name'])
{
return $k;
}
}

return -1;
}
}
?> 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/453925.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云计算的概念_云计算概念掀起涨停潮 美利云奠定板块龙头地位

温馨提示&#xff1a;股市风险时刻存在&#xff0c;文中所提个股仅为个人观点&#xff0c;请勿盲目跟随操作&#xff0c;笔者希望大家都做到不贪婪&#xff0c;不恐惧&#xff0c;不瞎猜&#xff0c;不跟风做一个纪律严明轻松淡定的股票交易者。社4月26日讯&#xff0c;沪深两市…

Python 第三方模块之 PDFMiner(pdf信息提取)

PDFMiner简介 pdf提取目前的解决方案大致只有pyPDF和PDFMiner。据说PDFMiner更适合文本的解析&#xff0c;首先说明的是解析PDF是非常蛋疼的事&#xff0c;即使是PDFMiner对于格式不工整的PDF解析效果也不怎么样&#xff0c;所以连PDFMiner的开发者都吐槽PDF is evil. 不过这些…

TFS2017持续发布中调用PowerShell启停远程应用程序

目前团队项目中有多个Web、服务以及与大数据平台对接接口等应用&#xff0c;每次的发布和部署采用手工的方式进行。停止应用程序&#xff0c;拷贝发布包&#xff0c;启动应用程序&#xff0c;不停的循环着&#xff0c;并且时不时地会出现一些人为错误性问题。这种模式消耗的很多…

Flask 多线程

参数 app.run()中可以接受两个参数&#xff0c;分别是threaded和processes&#xff0c;用于开启线程支持和进程支持。 threaded&#xff1a; 是否开启多线程&#xff0c;默认不开启。 if __name__ __main__:app.run(threadedTrue)processes&#xff1a;进程数量&#xff0c…

40天python入门教程_Python入门教程超详细1小时学会Python

Java和Javascript,不用1小时你就可以用Python快速流畅地写有用的Python程序.为什么使用Python假设我们有这么一项任务:简单测试局域网中的电脑是否连通.这些电脑的ip范围从192.168.0.101到192.168.0.200.思路:用shell编程.(Linux通常是bash而Windows是批处理脚本).例如,在Windo…

基于LVS对LAMP做负载均衡集群

一、简介 LVS是Linux Virtual Server的简称&#xff0c;也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目&#xff0c;它的官方站点是www.linuxvirtualserver.org。现在LVS已经是 Linux标准内核的一部分&#xff0c;在Linux2.4内核以前&#xff0c;使用LVS时必须要…

Python_Day1

1、猜年龄游戏&#xff1a; &#xff08;1&#xff09;&#xff1a;每循环3次&#xff0c;counter值返回为0&#xff0c;重新开始循环&#xff1b;&#xff08;2&#xff09;&#xff1a;continue 意思是跳出当前循环&#xff1b;&#xff08;3&#xff09;&#xff1…

kafka 入门

初识 Kafka 什么是 Kafka Kafka 是由 Linkedin 公司开发的&#xff0c;它是一个分布式的&#xff0c;支持多分区、多副本&#xff0c;基于 Zookeeper 的分布式消息流平台&#xff0c;它同时也是一款开源的 基于发布订阅模式的消息引擎系统。 Kafka 的基本术语 消息&#xf…

实体词典 情感词典_tidytextpy包 | 对三体进行情感分析

腾讯课堂 | Python网络爬虫与文本分析TidyTextPy前天我分享了 tidytext | 耳目一新的R-style文本分析库 但是tidytext不够完善&#xff0c;我在tidytext基础上增加了情感词典&#xff0c;可以进行情感计算&#xff0c;为了区别前者&#xff0c;将其命名为tidytextpy。大家有时间…

TensorFlow实现LeNet5模型

# -*- coding: utf-8 -*-import tensorflow as tffrom tensorflow.examples.tutorials.mnist import input_data# 获取mnist数据mnist input_data.read_data_sets("MNIST_data/", one_hotTrue)# 注册默认session 后面操作无需指定session 不同sesson之间的数据是独立…

Python基础第一天

一、内容 二、练习 练习1 题目&#xff1a;使用while循环输出1 2 3 4 5 6 8 9 10 方法一&#xff1a; 图示&#xff1a; 代码&#xff1a; count 1 while count < 11:if count ! 7:print(count)count 1输出结果&#xff1a; 1 2 3 4 5 6 8 9 10 View Code方法二&#xff1…

python flask 上传下载 api_Flask 文件下载API

给前端提供一个文件下载接口时, 遇到了文件名乱码的问题, 几经折腾总算实现效果, 代码如下:import requestsfrom flask import Response, jsonify, request, stream_with_contextfrom flask_login import login_requiredfrom . import bpfrom .models import Coursewarebp.rout…

OpenGL实用开源代码列表

有了网络的最大好处就是可以资源共享。网络是最大的知识库&#xff0c;也是最好的老师&#xff0c;正所谓“没有你想不到的&#xff0c;只有你找不到的”。以下是我收集的以游戏编程&#xff0c;OpenGL 3D编程相关的免费扩展库资料。不断更新中&#xff0c;如果你有好的建义&am…

vaOJ10369 - Arctic Network

1 /*2 The first line of each test case contains 1 < S < 100, the number of satellite channels!3 注意&#xff1a;S表示一共有多少个卫星&#xff0c;那么就是有 最多有S-1个通道&#xff01; 然后将最小生成树中的后边的 S-1通道去掉就行了&#xff01; 4…

python-kafka 常用 api 汇总

简介 python连接kafka的标准库&#xff0c;kafka-python和pykafka。kafka-python使用的人多是比较成熟的库&#xff0c;kafka-python并没有zk的支持。pykafka是Samsa的升级版本&#xff0c;使用samsa连接zookeeper&#xff0c;生产者直接连接kafka服务器列表&#xff0c;消费者…

scp选择二进制_二进制传输与文本传输区别

Ftp&#xff0c;winscp等工具下载文件时候有选项&#xff0c;可选的有二进制方式和文本方式。文本方式又称为ASCII方式两者区别如下。ASCII 方式和BINARY方式的区别是回车换行的处理&#xff0c;binary方式不对数据执行任何处理&#xff0c;ASCII 方式将回车换行转换为本机的回…

在ffmpeg中加入x264模块

引言&#xff1a;最近一直致力于多媒体应用开发&#xff0c;一说起编码解码就不得不说下FFmpeg。FFmpeg是一个集录制、转换、音/视频编码解码功能为一体的完整的开源解决方案。FFmpeg的开发是基于Linux操作系统&#xff0c;但是可以在大多数操作系统中编译和使用。下面就详细介…

RabbitMQ实例教程:发布/订阅者消息队列

消息交换机&#xff08;Exchange&#xff09; RabbitMQ消息模型的核心理念是生产者永远不会直接发送任何消息给队列&#xff0c;一般的情况生产者甚至不知道消息应该发送到哪些队列。 相反的&#xff0c;生产者只能发送消息给交换机&#xff08;Exchange&#xff09;。交换机的…

OAuth 2.0(网转)

&#xff08;一&#xff09;背景知识 OAuth 2.0很可能是下一代的“用户验证和授权”标准&#xff0c;目前在国内还没有很靠谱的技术资料。为了弘扬“开放精神”&#xff0c;让业内的人更容易理解“开放平台”相关技术&#xff0c;进而长远地促进国内开放平台领域的发展&#xf…

kafka 自动提交 和 手动提交

Consumer 需要向 Kafka 汇报自己的位移数据&#xff0c;这个汇报过程被称为提交位移&#xff08;Committing Offsets&#xff09;。因为 Consumer 能够同时消费多个分区的数据&#xff0c;所以位移的提交实际上是在分区粒度上进行的&#xff0c;即 Consumer 需要为分配给它的每…