如何使用ffmpeg/php在单击按钮时将mp4文件转换为mp3? [英] How to convert mp4 files into mp3 on button click using ffmpeg/php?
问题描述
我正在处理如下所示的php代码,其中我使用系统命令 ffmpeg (在下面的案例中)将 mp4文件转换为mp3 .
I am working on a php code as shown below where I am converting mp4 files into mp3 using system command ffmpeg (in the case statement below).
<?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文件进入destination_dir .如果新的mp4文件到达 $ src_dir ,则转换通常在刷新页面时发生.
After conversion, mp3 files goes into destination_dir. If new mp4 file arrives in $src_dir, the conversion usually happen on refresh of a page.
转换完成后,我将所有内容解析到表中,如下所示:
Once the conversion is complete, I am parsing everything into table as shown below:
<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>
问题陈述:
我想知道应该对上面的php代码进行哪些更改,只要单击转到按钮,就会发生将单个 mp4转换为mp3 的情况.
I am wondering what changes I should make in the php code above that on click of a Go button, conversion of individual mp4 into mp3 happen.
点击转到按钮时,属于单个行的单个mp3文件(来自mp4)应放在目标目录($ destination_dir)强>.
On clicking of Go button, individual mp3 file (from an mp4) belonging to an individual row should go inside destination directory ($destination_dir).
推荐答案
最好的方法是使用 AJAX-服务器响应
The best way is to use XMLHttpRequest with better example here AJAX - Server Response
创建这样的javascript函数:
Create a javascript function like this :
<script>
// Check if the window is loaded
window.addEventListener('load', function () {
// Function to call Ajax request to convert or move file
var go = function(key, btn) {
// Initialize request
var xhttp = new XMLHttpRequest();
// Execute code when the request ready state is changed and handle response.
// Optional but recommended.
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
// Do what you want here with the response here
document.getElementById('myResponse').innerHTML = this.responseText;
// Disable the button to not clicking again
// see https://www.w3schools.com/jsref/prop_pushbutton_disabled.asp
btn.disabled = true;
}
};
// Handle error message here
// Optional but recommended.
xhttp.onerror = function(event) {
document.getElementById('myResponse').innerHTML = 'Request error:' + event.target.status;
};
// Create request to the server
// Call the page that convert .mp4 or move .mp3
xhttp.open('POST', '/your_convert_file.php', true);
// Pass key or name or something (secure) to retrieve the file
// and send the request to the server
xhttp.send('key=' + key);
}
)};
</script>
根据需要添加一些内容来处理服务器的响应;例如:
Add somewhere something to handle the response of the server as you want; example:
<div id="myResponse"></div>
修改按钮以调用javascript函数onclick="go('<?php echo $key; ?>', this); return false;"
:
Modify the button to call the javascript function onclick="go('<?php echo $key; ?>', this); return false;"
:
<button style="width:90px;" type="button" class="btn btn-outline-primary" onclick="go('<?php echo $key; ?>', this); return false;">Go</button>
花时间学习Ajax调用的工作原理,如果不使用表单,与服务器通信非常重要
您可以使用JQuery,但最好不要使用;)
You can use JQuery but it's better without ;)
修改
使用表格,您可以执行以下操作:
Using form, you can do this:
<form id="formId" action="your_page.php" method="post">
<!-- your table here -->
<input type="hidden" id="key" name="key" value="">
</form>
<script>
var go = function(key) {
document.getElementById('key').value = key;
document.getElementById('formId').submit();
}
</script>
编辑:
用门牌号basename($file, ".mp4")
和page.php
或your_encoder.php
,以进行Ajax调用:
and the page.php
or your_encoder.php
as you want for an Ajax call :
// EXAMPLE FOR AJAX CALL
<?php
// Get the unique name or key
$key = $_POST['key'];
// If key is empty, no need to go further.
if(empty($_POST['key'])) {
echo "File name is empty !";
exit();
}
// Can be secure by performing string sanitize
$filePath = $src_dir . DS . $key . '.mp4';
// Check if file exists
// echo a json string to parse it in javascript is better
if (file_exists($filePath)) {
system('ffmpeg -i ' . $filePath . ' -map 0:2 -ac 1 ' . $destination_dir . DS . $parts['filename'] . '.mp3', $result);
echo "The file $filePath has been encoded successfully.";
. "<br />"
. $result;
} else {
echo "The file $filePath does not exist";
}
?>
如果使用form
,则必须:
-
检查
$_POST['key']
是否存在
如果密钥存在则进行编码
do the encoding if key exists
发送新的html表.
// EXAMPLE FOR FORM CALL
<?php
// Get the unique name or key
$key = $_POST['key'];
// If key is not empty.
if(!empty($_POST['key'])) {
// do the encoding here like above
// set message success | error
}
// display your html table and message here.
?>
编辑:
I know this adapted from your preview question but this code is "uncorrect", it works, no problem, but it can be optimized like this :
来自...
<?php
// Here, you list only .mp4 in the directory
// see: https://www.php.net/manual/en/function.preg-grep.php
$mp4_files = preg_grep('~\.(mp4)$~', scandir($src_dir));
// Here you loop only on all .mp4
foreach ($mp4_files as $f)
{
$parts = pathinfo($f);
// Here, you check if extension is .mp4
// Useless, because it is always the case.
// see : https://www.php.net/manual/en/control-structures.switch.php
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));
?>
...到
<?php
// Here, you list only .mp4 on the directory
$mp4_files = preg_grep('~\.(mp4)$~', scandir($src_dir));
// Here you loop only on all .mp4
foreach ($mp4_files as $f)
{
$filePath = $src_dir . DS . $f;
// No more need to switch, preg_reg do the job before looping
// Through this command conversion happens.
system('ffmpeg -i ' . $filePath . ' -map 0:2 -ac 1 ' . $destination_dir . DS . pathinfo($f, 'filename') . '.mp3', $result);
}
$mp3_files = preg_grep('/^([^.])/', scandir($destination_dir));
?>
这篇关于如何使用ffmpeg/php在单击按钮时将mp4文件转换为mp3?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!