从PHP脚本运行dir2ogg [英] Running dir2ogg from php script

查看:85
本文介绍了从PHP脚本运行dir2ogg的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试编写一个php脚本,它将接收一个上载的mp3文件并自动以ogg格式创建它的副本.我的想法是使用exec()或shell_exec()从php运行dir2ogg.这是我的代码:

I am trying to write a php script where it will take an uploaded mp3 file and automatically create a copy of it in ogg format. My idea is to use exec() or shell_exec() to run dir2ogg from php. This is my code:

$command = 'dir2ogg /var/www/bais-mordechai-laravel/public/uploads/"'.$filename.'"';
$output = shell_exec($command);

我从中得到的输出只是预期输出的第一行:

The output that I am getting from this is only the first line of the expected output:

dir2ogg 0.11.8 (2009-08-04), converts audio files into ogg vorbis.

直接从命令行(以root用户身份)运行此命令时,会得到以下信息:

When I run this directly from the command line (as root user) I get the following:

dir2ogg 0.11.8 (2009-08-04), converts audio files into ogg vorbis.

INFO: Converting "/var/www/bais-mordechai-laravel/public/uploads/Track 02.mp3" (using mpg123 as decoder)...
[wav.c:371] warning: Cannot rewind WAV file. File-format isn't fully conform now.
Encoding standard input to 
         "/var/www/bais-mordechai-laravel/public/uploads/Track 02.ogg" 
at quality 3.00
    Encoding [ 0m15s so far] / [wav.c:371] warning: Cannot rewind WAV file. File-format     isn't fully conform now.


Done encoding file "/var/www/bais-mordechai-laravel/public/uploads/Track 02.ogg"

File length:  3m 50.0s
Elapsed time: 0m 15.7s
Rate:         14.6600
Average bitrate: 91.1 kb/s

因此,似乎函数在命令完成执行之前就已返回.

So it seems that the function is returning before the command is finished executing.

我认为脚本可能会自行完成,但是没有按照我的意图创建ogg文件.

I thought that perhaps the script finished on its own, but there is no ogg file created as I intend.

所以我的问题是如何使它工作,或者如何进行调试?

So my question is how do I get this to work, or how can I go about debugging this?

更新: 根据Mehran的建议,这是我的stderr输出:

UPDATE: Using Mehran's advice, here is my stderr output:

Array
(
[stdout] => dir2ogg 0.11.8 (2009-08-04), converts audio files into ogg vorbis.


[stderr] => Traceback (most recent call last):
  File "/usr/bin/dir2ogg", line 673, in <module>
main()
  File "/usr/bin/dir2ogg", line 641, in main
conf = read_opts()
  File "/usr/bin/dir2ogg", line 120, in read_opts
in_path = [prefix for prefix in os.environ['PATH'].split(os.pathsep) if os.path.exists(os.path.join(prefix, command))]
  File "/usr/lib/python2.7/UserDict.py", line 23, in __getitem__
raise KeyError(key)
KeyError: 'PATH'

[return] => 1
)

推荐答案

您的问题背后的原因是特定于您的系统的,因为我可以轻松地运行您的代码并生成.ogg文件.这是当我运行包含您的代码的php文件时得到的:

The reason behind your problem is specific to your system as I can easily run your code and generate the .ogg file. Here's what I get when I run a php file with your code in it:

dir2ogg 0.11.8 (2009-08-04), converts audio files into ogg vorbis.

INFO: Converting "/home/mehran/001.mp3" (using mpg123 as decoder)...

正如我在成功创建001.ogg之前所说的那样.执行过程中发生的一切都与您的配置有关.调试它的方法是获取并打印该过程的stderr.这是获得它的方法(shell_execexec函数不提供此功能):

And as I said before the 001.ogg is successfully created. Whatever is going on with your execution is specific to your configuration. The way to debug it is to get and print the stderr of the process. Here's how you can get it (shell_exec and exec functions do not give you that):

<?php
function _pipeExec($cmd, $input = '')
{
    $proc = proc_open($cmd, array(0 => array('pipe', 'r'), 1 => array('pipe', 'w'), 2 => array('pipe', 'w')), $pipes);
    fwrite($pipes[0], $input);
    fclose($pipes[0]);
    $stdout = stream_get_contents($pipes[1]);
    fclose($pipes[1]);
    $stderr = stream_get_contents($pipes[2]);
    fclose($pipes[2]);
    $rtn = proc_close($proc);
    $result = array(
        'stdout' => $stdout
        , 'stderr' => $stderr
        , 'return' => $rtn
    );
    return $result;
}

$command = 'dir2ogg /home/mehran/"001.mp3"';
$output = _pipeExec($command);
print_r($output);

您可以在 proc_open此处找到更多信息.但是简短的描述是它可以完全满足您的要求,它为您提供一个过程产生的所有输出.在我的计算机中,上面的代码生成:

You can find more information on proc_open here. But the short description is that it does what exactly you want, it gives you all the outputs one process produces. In my computer the above code generates:

Array
(
    [stdout] => dir2ogg 0.11.8 (2009-08-04), converts audio files into ogg vorbis.

INFO: Converting "/home/mehran/001.mp3" (using mpg123 as decoder)...

    [stderr] => [wav.c:371] warning: Cannot rewind WAV file. File-format isn't fully conform now.
Encoding standard input to 
         "/home/mehran/001.ogg" 
at quality 3.00

    Encoding [ 0m00s so far] | 
    Encoding [ 0m00s so far] / 
    Encoding [ 0m00s so far] - 
    Encoding [ 0m00s so far] \ 
    Encoding [ 0m00s so far] | 
    Encoding [ 0m00s so far] / 
    Encoding [ 0m00s so far] - 
    Encoding [ 0m00s so far] \ 
    Encoding [ 0m00s so far] | 
    Encoding [ 0m00s so far] / 
    Encoding [ 0m00s so far] - 
    Encoding [ 0m00s so far] \ 
    Encoding [ 0m00s so far] | 
    Encoding [ 0m00s so far] / 
    Encoding [ 0m00s so far] - 
    Encoding [ 0m00s so far] \ 
    Encoding [ 0m00s so far] | 
    Encoding [ 0m00s so far] / 
    Encoding [ 0m00s so far] - 
    Encoding [ 0m00s so far] \ 
    Encoding [ 0m00s so far] | 
    Encoding [ 0m00s so far] / 
    Encoding [ 0m00s so far] - 
    Encoding [ 0m00s so far] \ 
    Encoding [ 0m00s so far] | 
    Encoding [ 0m00s so far] / 
    Encoding [ 0m00s so far] - 
    Encoding [ 0m00s so far] \ 
    Encoding [ 0m00s so far] | 
    Encoding [ 0m00s so far] / 
    Encoding [ 0m00s so far] - 
    Encoding [ 0m00s so far] \ 
    Encoding [ 0m00s so far] | 
    Encoding [ 0m00s so far] / 
    Encoding [ 0m00s so far] - 
    Encoding [ 0m00s so far] \ 
    Encoding [ 0m00s so far] | 
    Encoding [ 0m00s so far] / 
    Encoding [ 0m00s so far] - 
    Encoding [ 0m00s so far] \ 
    Encoding [ 0m00s so far] | 
    Encoding [ 0m00s so far] / 
    Encoding [ 0m00s so far] - 
    Encoding [ 0m00s so far] \ 
    Encoding [ 0m00s so far] | 
    Encoding [ 0m00s so far] / 
    Encoding [ 0m00s so far] - 
    Encoding [ 0m00s so far] \ 
    Encoding [ 0m00s so far] | 
    Encoding [ 0m00s so far] / 
    Encoding [ 0m00s so far] - 
    Encoding [ 0m00s so far] \ 
    Encoding [ 0m00s so far] | 
    Encoding [ 0m00s so far] / 
    Encoding [ 0m00s so far] - 
    Encoding [ 0m00s so far] \ 
    Encoding [ 0m00s so far] | 
    Encoding [ 0m00s so far] / 
    Encoding [ 0m00s so far] - 
    Encoding [ 0m00s so far] \ 
    Encoding [ 0m00s so far] | 
    Encoding [ 0m00s so far] / 
    Encoding [ 0m00s so far] - 
    Encoding [ 0m00s so far] \ 
    Encoding [ 0m00s so far] | 
    Encoding [ 0m00s so far] / 
    Encoding [ 0m00s so far] - 
    Encoding [ 0m00s so far] \ 
    Encoding [ 0m00s so far] | 
    Encoding [ 0m01s so far] / 
    Encoding [ 0m01s so far] - 
    Encoding [ 0m01s so far] \ 
    Encoding [ 0m01s so far] | 
    Encoding [ 0m01s so far] / 
    Encoding [ 0m01s so far] - 
    Encoding [ 0m01s so far] \ 
    Encoding [ 0m01s so far] | 
    Encoding [ 0m01s so far] / 
    Encoding [ 0m01s so far] - 
    Encoding [ 0m01s so far] \ 
    Encoding [ 0m01s so far] | 
    Encoding [ 0m01s so far] / 
    Encoding [ 0m01s so far] - 
    Encoding [ 0m01s so far] \ 
    Encoding [ 0m01s so far] | 
    Encoding [ 0m01s so far] / 
    Encoding [ 0m01s so far] - 
    Encoding [ 0m01s so far] \ 
    Encoding [ 0m01s so far] | 
    Encoding [ 0m01s so far] / 
    Encoding [ 0m01s so far] - 
    Encoding [ 0m01s so far] \ 
    Encoding [ 0m01s so far] | 
    Encoding [ 0m01s so far] / 
    Encoding [ 0m01s so far] - 
    Encoding [ 0m01s so far] \ 
    Encoding [ 0m01s so far] | 
    Encoding [ 0m01s so far] / 
    Encoding [ 0m01s so far] - 
    Encoding [ 0m01s so far] \ 
    Encoding [ 0m01s so far] | 
    Encoding [ 0m01s so far] / 
    Encoding [ 0m01s so far] - 
    Encoding [ 0m01s so far] \ 
    Encoding [ 0m01s so far] | 
    Encoding [ 0m01s so far] / 
    Encoding [ 0m01s so far] - 
    Encoding [ 0m01s so far] \ 
    Encoding [ 0m01s so far] | 
    Encoding [ 0m01s so far] / 
    Encoding [ 0m01s so far] - 
    Encoding [ 0m01s so far] \ 
    Encoding [ 0m01s so far] | 
    Encoding [ 0m01s so far] / 
    Encoding [ 0m01s so far] - 
    Encoding [ 0m01s so far] \ 
    Encoding [ 0m01s so far] | 
    Encoding [ 0m01s so far] / 
    Encoding [ 0m01s so far] - 
    Encoding [ 0m01s so far] \ 
    Encoding [ 0m01s so far] | 
    Encoding [ 0m01s so far] / 
    Encoding [ 0m01s so far] - 
    Encoding [ 0m01s so far] \ 
    Encoding [ 0m01s so far] | 
    Encoding [ 0m01s so far] / 
    Encoding [ 0m01s so far] - 
    Encoding [ 0m02s so far] \ 
    Encoding [ 0m02s so far] | 
    Encoding [ 0m02s so far] / 
    Encoding [ 0m02s so far] - 
    Encoding [ 0m02s so far] \ 
    Encoding [ 0m02s so far] | 
    Encoding [ 0m02s so far] / 
    Encoding [ 0m02s so far] - 
    Encoding [ 0m02s so far] \ 
    Encoding [ 0m02s so far] | 
    Encoding [ 0m02s so far] / 
    Encoding [ 0m02s so far] - 
    Encoding [ 0m02s so far] \ 
    Encoding [ 0m02s so far] | 
    Encoding [ 0m02s so far] / 
    Encoding [ 0m02s so far] - 
    Encoding [ 0m02s so far] \ 
    Encoding [ 0m02s so far] | 
    Encoding [ 0m02s so far] / 
    Encoding [ 0m02s so far] - 
    Encoding [ 0m02s so far] \ 
    Encoding [ 0m02s so far] | 
    Encoding [ 0m02s so far] / 
    Encoding [ 0m02s so far] - 
    Encoding [ 0m02s so far] \ 
    Encoding [ 0m02s so far] | 
    Encoding [ 0m02s so far] / 
    Encoding [ 0m02s so far] - 
    Encoding [ 0m02s so far] \ 
    Encoding [ 0m02s so far] | 
    Encoding [ 0m02s so far] / 
    Encoding [ 0m02s so far] - 
    Encoding [ 0m02s so far] \ 
    Encoding [ 0m02s so far] | 
    Encoding [ 0m02s so far] / 
    Encoding [ 0m02s so far] - 
    Encoding [ 0m02s so far] \ 
    Encoding [ 0m02s so far] | 
    Encoding [ 0m02s so far] / 
    Encoding [ 0m02s so far] - 
    Encoding [ 0m02s so far] \ 
    Encoding [ 0m02s so far] | 
    Encoding [ 0m02s so far] / 
    Encoding [ 0m02s so far] - 
    Encoding [ 0m02s so far] \ 
    Encoding [ 0m02s so far] | 
    Encoding [ 0m02s so far] / 
    Encoding [ 0m02s so far] - 
    Encoding [ 0m02s so far] \ 
    Encoding [ 0m02s so far] | 
    Encoding [ 0m02s so far] / 
    Encoding [ 0m02s so far] - 
    Encoding [ 0m02s so far] \ 
    Encoding [ 0m02s so far] | 
    Encoding [ 0m02s so far] / 
    Encoding [ 0m02s so far] - 
    Encoding [ 0m02s so far] \ 
    Encoding [ 0m02s so far] | 
    Encoding [ 0m03s so far] / 
    Encoding [ 0m03s so far] - 
    Encoding [ 0m03s so far] \ 
    Encoding [ 0m03s so far] | 
    Encoding [ 0m03s so far] / 
    Encoding [ 0m03s so far] - 
    Encoding [ 0m03s so far] \ 
    Encoding [ 0m03s so far] | 
    Encoding [ 0m03s so far] / 
    Encoding [ 0m03s so far] - 
    Encoding [ 0m03s so far] \ 
    Encoding [ 0m03s so far] | 
    Encoding [ 0m03s so far] / 
    Encoding [ 0m03s so far] - 
    Encoding [ 0m03s so far] \ 
    Encoding [ 0m03s so far] | 
    Encoding [ 0m03s so far] / 
    Encoding [ 0m03s so far] - 
    Encoding [ 0m03s so far] \ 
    Encoding [ 0m03s so far] | 
    Encoding [ 0m03s so far] / 
    Encoding [ 0m03s so far] - 
    Encoding [ 0m03s so far] \ 
    Encoding [ 0m03s so far] | 
    Encoding [ 0m03s so far] / 
    Encoding [ 0m03s so far] - 
    Encoding [ 0m03s so far] \ 
    Encoding [ 0m03s so far] | 
    Encoding [ 0m03s so far] / 
    Encoding [ 0m03s so far] - 
    Encoding [ 0m03s so far] \ 
    Encoding [ 0m03s so far] | 
    Encoding [ 0m03s so far] / 
    Encoding [ 0m03s so far] - 
    Encoding [ 0m03s so far] \ 
    Encoding [ 0m03s so far] | 
    Encoding [ 0m03s so far] / 
    Encoding [ 0m03s so far] - 
    Encoding [ 0m03s so far] \ 
    Encoding [ 0m03s so far] | 
    Encoding [ 0m03s so far] / 
    Encoding [ 0m03s so far] - 
    Encoding [ 0m03s so far] \ 
    Encoding [ 0m03s so far] | 
    Encoding [ 0m03s so far] / 
    Encoding [ 0m03s so far] - 
    Encoding [ 0m03s so far] \ 
    Encoding [ 0m03s so far] | 
    Encoding [ 0m03s so far] / 
    Encoding [ 0m03s so far] - 
    Encoding [ 0m03s so far] \ 
    Encoding [ 0m03s so far] | 
    Encoding [ 0m03s so far] / 
    Encoding [ 0m04s so far] - 
    Encoding [ 0m04s so far] \ 
    Encoding [ 0m04s so far] | 
    Encoding [ 0m04s so far] / 
    Encoding [ 0m04s so far] - 
    Encoding [ 0m04s so far] \ 
    Encoding [ 0m04s so far] | 
    Encoding [ 0m04s so far] / 
    Encoding [ 0m04s so far] - 
    Encoding [ 0m04s so far] \ 
    Encoding [ 0m04s so far] | 
    Encoding [ 0m04s so far] / 
    Encoding [ 0m04s so far] - 
    Encoding [ 0m04s so far] \ 
    Encoding [ 0m04s so far] | 
    Encoding [ 0m04s so far] / 
    Encoding [ 0m04s so far] - 
    Encoding [ 0m04s so far] \ 
    Encoding [ 0m04s so far] | 
    Encoding [ 0m04s so far] / 
    Encoding [ 0m04s so far] - 
    Encoding [ 0m04s so far] \ 
    Encoding [ 0m04s so far] | 
    Encoding [ 0m04s so far] / 
    Encoding [ 0m04s so far] - 
    Encoding [ 0m04s so far] \ 
    Encoding [ 0m04s so far] | 
    Encoding [ 0m04s so far] / 
    Encoding [ 0m04s so far] - 
    Encoding [ 0m04s so far] \ 
    Encoding [ 0m04s so far] | 
    Encoding [ 0m04s so far] / 
    Encoding [ 0m04s so far] - 
    Encoding [ 0m04s so far] \ 
    Encoding [ 0m04s so far] | 
    Encoding [ 0m04s so far] / 
    Encoding [ 0m04s so far] - 
    Encoding [ 0m04s so far] \ 
    Encoding [ 0m04s so far] | 
    Encoding [ 0m04s so far] / 
    Encoding [ 0m04s so far] - 
    Encoding [ 0m04s so far] \ 
    Encoding [ 0m04s so far] | 
    Encoding [ 0m04s so far] / 
    Encoding [ 0m04s so far] - 
    Encoding [ 0m04s so far] \ 
    Encoding [ 0m04s so far] | 
    Encoding [ 0m04s so far] / 
    Encoding [ 0m04s so far] - 
    Encoding [ 0m04s so far] \ 
    Encoding [ 0m04s so far] | 
    Encoding [ 0m05s so far] / 
    Encoding [ 0m05s so far] - 
    Encoding [ 0m05s so far] \ 
    Encoding [ 0m05s so far] | 
    Encoding [ 0m05s so far] / [wav.c:371] warning: Cannot rewind WAV file. File-format isn't fully conform now.

    Encoding [ 0m05s so far] - 

Done encoding file "/home/mehran/001.ogg"

    File length:  3m 13.0s
    Elapsed time: 0m 05.1s
    Rate:         37.8620
    Average bitrate: 110.9 kb/s


    [return] => 0
)

您可以使用return值来检查该过程是否成功,并且您甚至可以看到进度指示器也已打印出来.不过,您可以查看stderr并查找代码出了什么问题.

You can use the return value to check for the success of the process, and as you can see even the progress indicator is also printed. Nevertheless, you can look into stderr and find what's wrong with your code.

[UPDATE]

很遗憾,我无法复制您的错误.我只是尝试做您想做的事情,并且遇到了我自己的问题,我认为值得分享.这是我完整的有效代码,用于上载和转换音频文件:

Unfortunately, I can not replicate your error. I just tried to do what you are trying to do and faced a problem of my own I thought it's worth sharing. Here's my complete, working code to upload and convert an audio file:

<?php

function _pipeExec($cmd, $input = '')
{
    $proc = proc_open($cmd, array(0 => array('pipe', 'r'), 1 => array('pipe', 'w'), 2 => array('pipe', 'w')), $pipes);
    fwrite($pipes[0], $input);
    fclose($pipes[0]);
    $stdout = stream_get_contents($pipes[1]);
    fclose($pipes[1]);
    $stderr = stream_get_contents($pipes[2]);
    fclose($pipes[2]);
    $rtn = proc_close($proc);
    $result = array(
        'stdout' => $stdout
        , 'stderr' => $stderr
        , 'return' => $rtn
    );
    return $result;
}
?>

<html>
<body>

<form method="post" action="./ogg.php" enctype="multipart/form-data">
    <label for="file">Filename:</label>
    <input type="file" name="music" id="file"><br>
    <input type="submit" name="submit" value="Submit">
</form>

<?php
if (isset($_FILES['music'])) {
    $des = $_FILES['music']['tmp_name'] .'.'. pathinfo($_FILES['music']['name'], PATHINFO_EXTENSION);
    rename($_FILES['music']['tmp_name'], $des);
    $command = 'dir2ogg "' . $des . '"';
    $output = _pipeExec($command);
    echo "<div style='height: 500px; overflow: auto;'><pre>";
    print_r($output);
    echo "</pre></div>";
}
?>

</body>
</html>

如果省略将导致问题的部分是:

The part which if you omit will result in a problem is:

$des = $_FILES['music']['tmp_name'] .'.'. pathinfo($_FILES['music']['name'], PATHINFO_EXTENSION);
rename($_FILES['music']['tmp_name'], $des);

这将重命名临时上载的文件,因此其扩展名与其原始文件名相同,即,它将.mp3附加到上载的文件中.没有这个,我无法将文件转换为.ogg文件.

This will rename the temporary uploaded file so it will have the same extension as its original filename, i.e. it will append .mp3 to the uploaded file. Without this I couldn't convert the file to an .ogg file.

关于错误的另一件事,请确保您上传的文件与dir2ogg兼容,正如我在此处的某些帖子中所读到的那样,其中某些格式不兼容,因此dir2ogg输出错误,例如你的.

One more thing regarding your error, make sure that the file you are uploading is compatible with dir2ogg as I have read in some of the posts here and there that some formats are not compatible and thus dir2ogg outputs errors like yours.

最后,请确保文件的大小不超过上传大小和/或帖子大小的限制. phpinfo()将提示您当前的upload_max_filesizepost_max_size.也许您的文件根本没有上传!您可以通过查看$_FILES['music']['error']来确保文件成功上传.

In the end, make sure that your file's size does not exceeds your upload size and/or post size limits. A phpinfo() will prompt you your current upload_max_filesize and post_max_size. Perhaps your file is not uploaded at all! You can make sure of your successful file upload by looking into the $_FILES['music']['error'].

这就是我所拥有的!

这篇关于从PHP脚本运行dir2ogg的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆