设为首页 收藏本站
查看: 729|回复: 0

[经验分享] PHP基础知识之

[复制链接]

尚未签到

发表于 2017-12-29 17:43:46 | 显示全部楼层 |阅读模式
简介
  本文将尝试指出在PHP Web脚本中使用FFmpeg时需要了解的所有重要事项。它还将显示一些使用示例,以使事情更清楚。这个想法也可以应用到其他web脚本语言。

从PHP脚本调用命令行工具

选择一个模型
  网页设计为快速执行,以便浏览您的网站的人不必等待太多的响应。因为如果他们无聊的等待,他们只会导航到另一个,更灵敏(通常是您的竞争对手的)网站。话虽如此,你可以做的最糟糕的事情是从你的web脚本运行一个命令行工具(如ffmpeg),并等待它完成处理,以便能够将结果返回到等待在线用户(异常这是小/快的工具,其执行时间太小而不能注意到)。
  您想要做的是将命令行工具的长处理与Web脚本执行分开,以使脚本更具响应性。所以,你有至少两个选项:


  • 运行命令行工具(使用了shell_exec()在后台为例),并继续与web脚本执行,定期刷新状态页面,显示当前进度
DSC0000.png



  • 创建一个新的“作业”(通常是数据库表中的一个新行),并有一些背景“工作”进程(cron作业,shell脚本,批处理脚本),它将监视“作业列表”需要处理的新工作
DSC0001.png

  这两种方法看起来是一样的,但是他们不是。最重要的区别是,第二种方法可以更好地扩展更高的网站流量,因为它允许“工作”进程在完全独立的机器上运行。此外,可以有几个“工作”机器,一起工作,分裂工作负载,涉及小的同步。
  第一种方法通常是大多数想要快速完成工作的人的首选,但是在他们的网站变得流行的时间,他们的web服务器变得不那么敏感,由于不断的cpu饥饿,由多个命令行工具(ffmpeg实例)在后台运行。在那一刻,他们通常开始考虑第二种方法。

在后台运行的ffmpeg
  以下示例适用于基于Linux的操作系统。对于基于Windows的操作系统,请继续阅读本文,而是你读了之后,也看到了如何使用START和CMD后台运行的过程。这将给你一个想法如何应用相同的逻辑到基于Windows的操作系统。
  让我们考虑从PHP脚本运行ffmpeg的自然方式:
  

<?phpecho "Starting ffmpeg...\n\n";echo ("ffmpeg -i input.avi output.avi &");echo "Done.\n";  

?>  

  这里有几个问题需要指出。第一个是,虽然我们指定我们希望在后台执行ffmpeg(使用和号运算符“&”),PHP脚本将不会继续执行,直到ffmpeg完成其执行。这是由于这样的事实,在该票据中提及了PHP的exec()函数,上面写着:
  如果程序使用此函数启动,为了使其在后台继续运行,程序的输出必须重定向到文件或另一个输出流。如果不这样做,将导致PHP挂起,直到程序的执行结束。
  不要混淆的例子显示了shell_exec()调用,而不是EXEC() 。所有的PHP的程序执行功能共享相同的代码库和限制。
  所以,要解决这个问题,我们需要做这样的事情:
  

<?phpecho "Starting ffmpeg...\n\n";echo ("ffmpeg -i input.avi output.avi >/dev/null 2>/dev/null &");echo "Done.\n";  

?>  

  该说的部分“ >的/ dev / null的 ”将FFmpeg的实例的标准输出(stdout)重定向到/ dev / null的(有效地忽略输出)和“ 2>的/ dev / null的 ”将重定向标准错误(错误)到/ dev / null(有效地忽略任何错误日志消息)。这两个可以组合成一个较短的表示:“ >的/ dev / null的2>&1 ”。如果你喜欢,你可以阅读更多关于I / O重定向。
  这里应该提到一个重要的注意事项。ffmpeg命令行工具使用stderr输出错误日志消息,并且保留stdout用于可能使用的管道(将从ffmpeg生成的输出媒体流重定向到其他命令行工具)。也就是说,如果你在后台运行你的ffmpeg,你很可能想把stderr重定向到一个日志文件,以便能够检查它。
  需要注意的另一件事是标准INPUT(stdin)。命令行ffmpeg工具被设计为一个交互式实用程序,它接受用户的输入(通常来自键盘),并在用户的当前屏幕/终端上报告错误日志。当我们在后台运行ffmpeg时,我们想要告诉ffmpeg没有从stdin接受任何输入(也不等待)。我们可以告诉这ffmpeg的,再次使用I / O重定向“ <的/ dev / null的 ”,这样最后一个例子,安全运行ffmpeg的命令行工具在后台将与此类似:
  

<?phpecho "Starting ffmpeg...\n\n";echo ("ffmpeg -y -i input.avi output.avi </dev/null >/dev/null 2>/var/log/ffmpeg.log &");echo "Done.\n";  

?>  

  在“-y”选项用于自动覆盖输出文件(output.avi)不要求是/否确认。如果需要相反的情况,如果输出文件已经存在,要自动取消整个过程,请改用“-n”选项。

包装库
  一些PHP库允许将ffmpeg调用包装到PHP对象中,并且如果您不喜欢使用命令行,可以为您提供一个不错的语法。其中之一是在积极维护PHP-FFmpeg的。它只需要你下载一个最新的ffmpeg和ffprobe从安装PHP组件构建分开。然后你可以这样运行PHP代码:
  

$ffmpeg = FFMpeg\FFMpeg::create();  

$video = $ffmpeg->open('video.mpg');  

$video->filters()->resize(new FFMpeg\Coordinate\Dimension(320, 240))->synchronize();  

$video->save(new FFMpeg\Format\Video\X264(), 'export-x264.mp4')  

  当然,你需要在后台运行这样的任务。图书馆如GearmanClient促成。
  注: ffmpeg的- PHP的是,2007年以来未开发的扩展名(和要求“的ffmpeg-0.4.9_pre1或更高版本”),这意味着你仅限于使用一种非常古老的版本的ffmpeg,没有可能把它更新到最新版本。由于进行了大量的更改/改进,在ffmpeg的代码中,每天,它使得ffmpeg-php与最新的ffmpeg不兼容。
  案例成功测试结果:
  

<?php  

echo "正在启动ffmpeg...\n\n";  

echo ("ffmpeg -y -i rtmp://tinywan.123.com/live/4001483413136 -c copy -f flv rtmp://131.180/live/4001483492781?vhost=13.168 </dev/null >/dev/null 2>/var/log/ffmpeg.log &");  

echo "完成.\n";  

  

正在启动ffmpeg...  

  
完成
.  

  日志文件:
  

ffmpeg version 2.3.git Copyright (c) 2000-2014 the FFmpeg developers  built on Sep
1 2014 19:01:47 with gcc 4.8 (Ubuntu 4.8.2-19ubuntu1)  configuration
: --prefix=/usr/local/ffmpeg/build --extra-cflags=-I/usr/local/ffmpeg/build/include --extra-ldflags=-L/usr/local/ffmpeg/build/lib --bindir=/usr/local/ffmpeg/bin --enable-gpl --enable-libass --enable-libfaac --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-nonfree --enable-openssl --enable-libspeex --enable-libxvid  libavutil
54.  7.100 / 54.  7.100  libavcodec
56.  1.100 / 56.  1.100  libavformat
56.  3.100 / 56.  3.100  libavdevice
56.  0.100 / 56.  0.100  libavfilter
5.  0.103 /  5.  0.103  libswscale
3.  0.100 /  3.  0.100  libswresample
1.  1.100 /  1.  1.100  libpostproc
53.  0.100 / 53.  0.100  
[flv @
0x2862000] Stream discovered after head already parsed  Last message repeated
1 times  
Input
#0, flv, from 'rtmp://tinywan.3213.com/live/4001483413136':  Metadata:
  Server          : Tengine
  displayWidth    : 1920
  displayHeight   : 1080
  fps             : 25
  profile         :
  level           :
  Duration: 00:00:00.00, start: 765.097000, bitrate: N/A
  Stream #0:0: Video: h264 (High), yuv420p(tv, bt709), 1920x1080, 1048 kb/s, 25 fps, 25 tbr, 1k tbn, 2k tbc
  Stream #0:1: Data: none
  Stream #0:2: Audio: aac, 44100 Hz, stereo, fltp
  
Output #0, flv, to 'rtmp://1232130/live/4001483492781?vhost=321312':
  Metadata:
  Server          : Tengine
  displayWidth    : 1920
  displayHeight   : 1080
  fps             : 25
  profile         :
  level           :
  encoder         : Lavf56.3.100
  Stream #0:0: Video: h264 ([7][0][0][0] / 0x0007), yuv420p, 1920x1080, q=2-31, 1048 kb/s, 25 fps, 1k tbn, 1k tbc
  Stream #0:1: Audio: aac ([10][0][0][0] / 0x000A), 44100 Hz, stereo
  
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:2 -> #0:1 (copy)
  
Press [q] to stop, [?] for help
  

  测试成功!
  参考文献:http://trac.ffmpeg.org/wiki/PHP

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-429432-1-1.html 上篇帖子: PHP 红包功能代码 下篇帖子: php调用python脚本
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表