自动上传视频文件并自动转flv、3gp等格式

上传并自动转flv / 3gp等格式的视频

越来越多的flv网站,如土豆、优酷、新浪播客等,掀起了flv网站的高潮;越来越多的手机视频下载站点,同样也出现了3gp的高潮,友情帮几个网站做了关于这方面的事情,支持.avi,.asf,.avs,.dat,.flv,.mkv,.mpg,.mp4,.mpeg,.mov,.ram,.rm,.rmvb,.ts,.vob,.wmv,.3gp等格式的文件上传,并自动将其转换为flv或者3gp、wmv格式的文件,这里把这方面的经验分享下。

(一)、首先,上传显示进度方面,如果要有易用的感觉,就需要有进度条,因为毕竟视频文件太大了,没有进度,用户感觉不方便。这里,界面外观基本上是仿sina的,当然,实现和它没有关系,sina是使用flash实现的获取上传进度,本文则是使用了php的特性。这里先截图说明下上传的效果图,有个整体印象:

上传界面截图1

视频上传中截图

上传成功的截图

(二)、上传的实现方法大致是:
      1、配置环境
      A)配置php环境,使其支持上传时显示进度,方法为:采用php5.2以上版本,然后启用php_apc扩展,以使得php支持上传过程中获取已上传的文件大小。
      B) 加入配置信息到php.ini中:apc.rfc1867 = on     apc.max_file_size = 200M。修改php.ini中的配置max_execution_time = 120   post_max_size = 1024M     upload_max_filesize = 200M
      C)重启web服务器

      2、上传的Form内加入<input type=”hidden” name=”APC_UPLOAD_PROGRESS” id=”progress_key” value=”你分配给本次上传的一个随机ID(获取进度时需要这个ID)” />
      3、写一个获取进度的页面,比如getProgress.php,内容很简单,主要是这个:apc_fetch(‘upload_’ . $_GET['progress_key']);这样如果传入对应的ID,就可以获得该文件的进度和文件名等信息了。
      4、为了显示进度,还需要通过Ajax技术,每隔1s或者0.5s,通过Ajax访问获取进度的页面getProgress.php,得到当前已经上传的文件大小。然后将结果显示出来。
     5、移动文件到目的目录:在上传的Form中,有个要提交到的页面,比如指定action=”target.php”。那么在target.php中,需要通过函数move_uploaded_file将文件移动到指定目录,否则,上传后的文件存在tmp目录中,提交完成会被自动删除。    
     6、其它:比如要控制上传的文件格式,只能是视频文件等细节功能。    
       这样,基本上上传页面就完成了。— 适合对flash不熟悉的,如果对flash熟悉,也可以借鉴sina他们的做法,直接使用swf的上传。

(三)、自动转换:   

         为了获得良好的转换速度,以及避免对网站用户的易用性影响。我们可以不把转换放到网页代码中,而是单独做一个exe程序,这样做出于两个考虑:一方面,由于独立的exe,不会影响网站服务的运行,网站只是简单的上传功能,所以系统更加稳定可靠,并且性能会好;
         另一方面,可以不受网站的影响,网站是asp、php、asp.net、jsp等,都可以使用自动转换程序来实现视频的转换。
         其实,甚至,这个转换程序还可以作为一个独立的转换程序,帮助用户转换手机文件等,虽然这类软件很多了,但通过代码实现一个自己的程序,还是很酷的,何况,自己实现可以完全控制程序的功能符合自己的要求。某个手机的厂商,可以利用类似的代码实现一个随机赠送的转换程序,是多么的Cool。呵呵,闲话少说,这里讨论下它的实现好了:

          首先,在这个系统中,程序要监视网站上传的文件夹,一旦发现有新的文件,则自动启动转换。转换完成后,可以直接访问数据库报告对该文件的转换结果;当然,也可以通过http访问一个页面,报告结果。这些辅助功能不细说了,主要说下转换功能的实现:

(四)自动转换功能的实现:

         基本上,绝大多数的视频网站,以及视频转换软件,都离不开mencoder和ffmpeg两个开源的软件,我们当然也要通过这两个软件来实现自动转换。关于这两个软件的具体信息,google和百度上可以给您答案。
          首先,如果你需要支持rm和rmvb格式的文件,或者,你需要加入你的片头信息(比如你们公司的一个几秒的宣传片段),那么,就需要使用mencoder了。这里将我用到的mencoder的参数列举一下:

          1)将文件统一转换为avi格式(目的是方便后面增加片头), mencoder.exe %input% -srate 32000 -vf-add scale=320:240 -ofps 24 -oac mp3lame -lameopts cbr:br=32:mode=0 -ovc xvid -xvidencopts bitrate=400 -o %output%       其中%input%是原始视频的路径 %output%是输出的视频路径。我的程序里面通过这两个关键字,在运行期间改为真正的路径,这里是配置信息,以方便修改其它参数。
           2)如果发现指定了片头文件,则合并片头,命令行如下: mencoder.exe -srate 32000 -vf-add scale=320:240 -ofps 24 -oac mp3lame -lameopts cbr:br=32:mode=0 -ovc xvid -xvidencopts bitrate=400 -o %output% %title% %input%   其中%title%是指片头文件,程序运行时,会根据配置信息读取片头的路径,如果指定了片头,则将片头路径把%title%替换掉。

           这样,视频就先转为了avi格式,并且如果有片头,则自动增加了片头。下一步,我们把它转换为flv文件或者3gp文件,此时需要使用ffmpeg:
           1)转flv: ffmpeg.exe -y -i %input% -ab 24 -ar 22050 -b 300 -s %filesize% %output%
           2)转3gp:ffmpeg.exe -y -i %input% -vcodec h263 -b 260 -s %filesize% -acodec aac -ac 1 -ar 8000 -ab 20 -f 3gp -r 15 %output%

           这样基本上转换就完成了。当然,很多网站还都有截图,截图的时间很重要,因为,比如你需要审核上传的内容,一个视频100分钟,希望截取10幅图片,那么当然,可能这种组合比较好:第一分钟截取一副,第10分钟……第100分钟。所以这种情况下,需要获取节目视频内容的时长:

           这个通过mediaInfo.exe(同样出色的一个开源软件)获取就好了,命令行大致如下:mediaInfo.exe –Inform=Video;%Duration% 这里的%Duration%就是这样写的,并不是我的某个关键字,这样就会输出视频的时长。根据这个总时长加上需要截图的数量,就可以计算合理的间隔,下一步就是截取图片了:

           ffmpeg.exe -i %input% -y -f image2 -ss %time% -t 0.001 -s 130×110 %i%.jpg   其中,%time%是要截图的时间是第几秒。%i%是图片的名字

           当然,如果您是提供3gp手机视频下载的网站,根据需要,你也可以截取任意长度的视频片段,比如20秒的视频片段,然后给客户使用flash播放器进行在线预览,只需要根据上面的参数灵活修改下就好了。

          这样,一个完整的转换过程就完成了。

(五)其它说明

       由于所实现的这套系统,在几家公司已经在使用,比如http://www.3gp8.com、 one-tom的http://www.xuexizu.com等,因此,无法在这里免费提供所有的源代码,只能提供一个大体的思路和过程,希望能够对您有所帮助。

       如需要整个系统和源码,请联系我们,http://blog.dolit.cn  http://www.dolit.cn

友荐云推荐

欢迎转载,转载请注明来源于点量软件官方博客,多谢合作!

本文永久链接地址: http://blog.dolit.cn/upload-and-convert-video-html

0篇评论

评论已关闭