欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

php ffmpeg 進度

錢浩然1年前10瀏覽0評論
< p >在使用php ffmpeg時,經常需要對處理任務的進度進行監控和控制,以便及時獲得處理結果或中止處理任務避免浪費資源。下面我們將介紹如何獲取ffmpeg進度以及如何利用php來監控和控制ffmpeg的進度。

< p >首先我們需要了解ffmpeg在命令行下返回進度信息的格式。通過執行命令"ffmpeg -i input.mp4 output.mp4",可以得到如下的輸出:

< pre >frame=177728 fps= 30 q=-1.0 Lsize= 212330kB time=00:98:31.29 bitrate= 291.2kbits/s speed=1.18x< p >其中"frame"表示已處理的幀數,"fps"表示當前處理速度,"time"表示已處理的時間,"speed"表示當前處理速度與視頻原始速度的比例。根據這些信息,我們可以計算出處理任務的百分比。

< p >為了在php中獲取進度信息,我們可以使用exec函數來執行ffmpeg命令,并通過正則表達式匹配輸出信息。下面是獲取進度百分比的代碼:

< pre >$output = array(); exec("ffmpeg -i input.mp4 output.mp4 2>&1", $output); $duration_pattern = '/Duration: (.*?),/'; preg_match($duration_pattern, implode("\n", $output), $matches); if (count($matches) >1) { $duration = explode(':', $matches[1]); $total_duration = $duration[0]*3600 + $duration[1]*60 + $duration[2]; } else { // Get duration failed! } $frame_pattern = '/frame=(\s*\d+)/'; $size_pattern = '/size=(.*?B)/'; $time_pattern = '/time=(.*?)[\s,]/'; $bitrate_pattern = '/bitrate=(.*?\skbits\/s)/'; foreach ($output as $line) { if (preg_match($frame_pattern, $line, $matches)) { $frame = intval(trim($matches[1])); $percent = $frame/$total_frames*100; echo "Processing video, $percent% done...
"; } }< p >在處理過程中,我們可以使用ajax技術實時更新進度,也可以使用進程間通信機制將進度信息傳給后臺處理程序。下面是使用ajax實時更新進度的代碼:

< pre >setInterval(function(){ $.ajax({ url: 'get_progress.php', method: 'GET', dataType: 'json', success: function(response){ if (response.percent) { $('#progress-bar').css('width', response.percent + '%'); $('#progress-bar').html(response.percent + '%'); } } }); }, 1000);< p >在get_progress.php文件中,我們通過執行ffmpeg命令來獲取進度信息,并將其轉換為json數據格式返回給前端頁面:

< pre >$output = array(); exec("ffmpeg -i input.mp4 output.mp4 2>&1", $output); // extract progress percentage $percent = 0; foreach ($output as $line) { if (preg_match('/Duration: (.*?),/', $line, $matches)) { $duration = explode(':', $matches[1]); $total_seconds = $duration[0]*3600 + $duration[1]*60 + $duration[2]; } if (preg_match('/time=(.*?) /', $line, $matches)) { $time = explode(':', $matches[1]); $current_seconds = $time[0]*3600 + $time[1]*60 + $time[2]; $percent = round(($current_seconds/$total_seconds)*100, 2); } } header('Content-Type: application/json'); echo json_encode(array('percent' =>$percent));< p >最后,我們還可以使用pcntl擴展來實現多進程處理任務,以提高處理任務的并發性能。在子進程中執行ffmpeg命令,并將進度信息發送給父進程,在父進程中匯總和管理進度信息,并通過信號通知子進程中止任務。下面是使用pcntl擴展實現進程間通信的代碼:

< pre >$sig_handler = function($signo){ global $pid; posix_kill($pid, SIGKILL); }; pcntl_signal(SIGUSR1, $sig_handler); $pid = pcntl_fork(); if (!$pid) { // child process $output = array(); exec("ffmpeg -i input.mp4 output.mp4 2>&1", $output); $frame_pattern = '/frame=(\s*\d+)/'; $size_pattern = '/size=(.*?B)/'; $time_pattern = '/time=(.*?)[\s,]/'; $bitrate_pattern = '/bitrate=(.*?\skbits\/s)/'; foreach ($output as $line) { if (preg_match($frame_pattern, $line, $matches)) { $frame = intval(trim($matches[1])); $percent = $frame/$total_frames*100; posix_kill(posix_getppid(), SIGUSR1); } } } else { // parent process while (1) { pcntl_signal_dispatch(); if ($percent === 100 || !posix_kill($pid, 0)) { break; } usleep(10000); } }< p >以上就是關于php ffmpeg進度的介紹,希望對大家有所幫助。