如何使用ffmpeg/php将mp4文件转换为mp3?

如何使用ffmpeg/php将mp4文件转换为mp3?,php,post,html-table,ffmpeg,mp4,Php,Post,Html Table,Ffmpeg,Mp4,我正在编写一个php代码,如下所示,使用系统命令ffmpeg(在下面的case语句中)将mp4文件转换为mp3 <?php $mp4_files = preg_grep('~\.(mp4)$~', scandir($src_dir)); foreach ($mp4_files as $f) { $parts = pathinfo($f); switch ($parts['extension']) { case 'mp4' :

我正在编写一个php代码,如下所示,使用系统命令ffmpeg(在下面的case语句中)mp4文件转换为mp3

<?php 

$mp4_files = preg_grep('~\.(mp4)$~', scandir($src_dir)); 

foreach ($mp4_files as $f)
 {

     $parts = pathinfo($f);
     switch ($parts['extension'])
     {
         case 'mp4' :
             $filePath = $src_dir . DS . $f;
             system('ffmpeg -i ' . $filePath . ' -map 0:2 -ac 1 ' . $destination_dir . DS . $parts['filename'] . '.mp3', $result);  // Through this command conversion happens. 
     }
 }

$mp3_files = preg_grep('/^([^.])/', scandir($destination_dir));

?>

转换后,mp3文件进入目标目录。如果新的mp4文件到达$src_dir,转换通常在刷新页面时发生

转换完成后,我将所有内容解析到表中,如下所示:

<table>
   <tr>
      <th style="width:8%; text-align:center;">House Number</th>
      <th style="width:8%; text-align:center;">MP4 Name</th>
      <th style="width:8%; text-align:center;" >Action/Status</th>
   </tr>
   <?php
      $mp4_files = array_values($mp4_files);
      $mp3_files = array_values($mp3_files);
      foreach ($programs as $key => $program)    { 
         $file = $mp4_files[$key];     
         $file2 = $mp3_files[$key];   // file2 is in mp3 folder
      ?>
   <tr>
      <td style="width:5%; text-align:center;"><span style="border: 1px solid black; padding:5px;"><?php echo basename($file, ".mp4"); ?></span></td> <!-- House Number -->
      <td style="width:5%; text-align:center;"><span style="border: 1px solid black; padding:5px;"><?php echo basename($file); ?></span></td> <!-- MP4 Name -->             
      <td style="width:5%; text-align:center;"><button style="width:90px;" type="button" class="btn btn-outline-primary">Go</button</td>  <!-- Go Button -->
   </tr>
   <?php } ?>
</table>

门牌号
MP4名称
行动/状态
Go最好的方法是在这里使用更好的例子

创建如下所示的javascript函数:


//检查窗口是否已加载
window.addEventListener('load',函数(){
//函数调用Ajax请求以转换或移动文件
var go=功能(键,btn){
//初始化请求
var xhttp=newXMLHttpRequest();
//当请求就绪状态更改时执行代码并处理响应。
//可选但推荐。
xhttp.onreadystatechange=函数(){
if(this.readyState==4&&this.status==200){
//在这里做你想做的事,在这里做你的回答
document.getElementById('myResponse').innerHTML=this.responseText;
//禁用该按钮以避免再次单击
//看https://www.w3schools.com/jsref/prop_pushbutton_disabled.asp
btn.disabled=true;
}
};
//在此处处理错误消息
//可选但推荐。
xhttp.onerror=函数(事件){
document.getElementById('myResponse')。innerHTML='请求错误:'+event.target.status;
};
//创建对服务器的请求
//调用convert.mp4或move.mp3页面
open('POST','/your_convert_file.php',true);
//传递密钥、名称或其他信息(安全)以检索文件
//并将请求发送到服务器
xhttp.send('key='+key);
}
)};
添加一些东西来处理服务器的响应;例如:


修改按钮以调用javascript函数
onclick=“go(“”,this);返回false;”


在编写脚本之前,您是否验证了ffmpeg命令是否有效?因为现在您正在强制它尝试转换第三个流(
-map 0:2
),而不考虑流类型。您的所有输入是否至少有3个流?否则,请使用
-map 0:a:0
。ffmpeg工作正常。没问题。我们只希望在单击单个行的
Go按钮时进行转换。我们真的需要使用AJAX吗?让我们想象一下,我们有任何mp4文件。单击Go按钮时,它应该进入
$destination\u dir
。我想我们可以不用AJAX吗?想法?如果你不想重新加载页面,你也可以这样做。表单或Ajax是相同的,文件移动由服务器完成。在resume中,单击该按钮,服务器将调用page.php,在page.php中,您可以随心所欲。。移动、转换、重命名。。。在表单的末尾,加载响应并刷新页面,ajax加载响应,但它是不可见的,您必须处理响应。您可以选择betwin form或ajax,betwin GET或POST。在服务器进程中,您还需要传递一个标识符来检索文件。我想知道的是,在单击Go按钮时,每个循环都会在转换发生的位置调用。要处理转换进度或任何需要的事件,您必须使用javascript和ajax。我真的不明白您想要做什么,但过程总是相同的客户端=>request=>server=>response=>client。