ffmpeg后台进程完成后如何管道新命令?

时间:2013-09-12 16:04:46

标签: php video process background ffmpeg

这是我的ffmpeg流程:

exec("/usr/local/bin/ffmpeg -y -i source.avi dest.mp4 >/dev/null 2>/dev/null &

现在,我希望在转换完成后执行PHP文件。从逻辑上讲,这就是我所拥有的:

exec("/usr/local/bin/ffmpeg -y -i source.avi dest.mp4 >/dev/null 2>/dev/null ; php proceed.php &

但这不起作用,因为PHP将阻止进程等待ffmpeg转换完成。我想要的基本上是在转换完成后调用proceed.php,这两个都是在后台完成的。

如果有人可以提供Windows服务器解决方案,那也很棒。

2 个答案:

答案 0 :(得分:3)

编写一个执行ffmpeg和php进程的外部(bash / php)脚本,并在此之后添加&

对于Windows,请在SO上打开一个新问题。

答案 1 :(得分:2)

要添加到Evert发布​​的内容,这里有一个我用于我的FFMPEG bash脚本的示例...它远未完成(例如,如果程序崩溃,它不会发出警报)但是它在某处开始:

#!/bin/sh

## Set our paths
FFMPEG_PATH=/usr/local/bin
SITE_PATH=path_to_file
VIDEO_PATH=$SITE_PATH/public_html/videos

## Make sure we have permissions to do this stuff
chown -R wwwrun:www $VIDEO_PATH/$2
chmod -R 765 $VIDEO_PATH/$2

## Set the options for mp4 compression
options="-vcodec libx264 -b 512k -ar 22050 -flags +loop+mv4 -cmp 256 \
       -partitions +parti4x4+parti8x8+partp4x4+partp8x8+partb8x8 \
       -me_method hex -subq 7 -trellis 1 -refs 5 -bf 3 \
       -flags2 +bpyramid+wpred+mixed_refs+dct8x8 -coder 1 -me_range 16 \
       -g 250 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -qmin 10\
       -qmax 51 -qdiff 4"

## Start the conversion.
$FFMPEG_PATH/ffmpeg -y -i $VIDEO_PATH/$2/original/$1 -an -pass 1 -threads 2 $options $VIDEO_PATH/$2/$2.mp4 2> $VIDEO_PATH/$2/pass_one.log
$FFMPEG_PATH/ffmpeg -y -i $VIDEO_PATH/$2/original/$1 -acodec libfaac -ab 96k -pass 2 -threads 2 $options $VIDEO_PATH/$2/$2.mp4 2> $VIDEO_PATH/$2/pass_two.log

## Create the thumbnail for the video
. $SITE_PATH/bin/create_thumbnail $2 00:00:15 2> $VIDEO_PATH/$2/generate_thumbnails.log

## Clean up the log files that were created
## find /log_path/ -name *log* -exec rm {} \;

## Update datbase and send email that we're done here.
php $SITE_PATH/public_html/admin/includes/video_status.php converting_finished $2

这一切都是从PHP文件中调用的(以及其他一些代码):

proc_close(proc_open(server_path.'/bin/convert_video_mp4 '.mysql_result($next_video, 0, "uid").'.'.mysql_result($next_video, 0, "original_ext").' '.mysql_result($next_video, 0, "uid").' &', array(), $foo));

PS - 我知道mysql扩展程序即将推出,我暂时没有使用或更新此代码,所以请更新到您的规范