window環境下php ffmpeg獲取視頻總時長與縮略圖 代碼

1、背景php

最近在給安卓客戶端提供API接口時,須要提供後臺上傳視頻的縮略圖,視頻總長。
    用搜索引擎搜索了下,windows環境下(我的本身電腦上用)獲取縮略圖的資料挺多,
    但獲取視頻總長的資料,基本都是linux環境。以下是本身整理的方法

2、準備linux

    windows環境下,只需去官網下載windows版本的FFmpeg,地址http://ffmpeg.zeranoe.com/builds/  
    我下載的是64-bit Shared版本。

    對,就只須要上述1步,而不須要費盡心機去網上找php5.5及之後版本的ffmpeg-php擴展。 反正我是沒找到。web

3、獲取視頻總時長windows

/**
 * 獲取視頻總時長
* @param string $ffmpeg_path  [ffmpeg.exe的絕對路徑]
 * @param string $video_path  [video的絕對路徑]
 */
function get_video_times($ffmpeg_path, $video_path){

    if (!file_exists($video_path))  return ['status'=>0, 'msg'=>'視頻文件不存在'];

    $times = false;
    $commond = "{$ffmpeg_path} -i {$video_path} 2>&1";
    exec($commond, $str_res, $str_r);

    if (is_array($str_res)){
        foreach($str_res as $v){
            if (strpos($v, 'Duration') !== false){
                $times = substr($v, stripos($v , '.') - 8, 8);//'  Duration: 00:24:28.14, start: 0.000000, bitrate: 486 kb/s'
                break;
            }
        }
    }
    
    return $times ? ['status'=>1, 'msg'=>$times] : ['status'=>0, 'msg'=>'獲取視頻時間失敗'];
}

調用方法:app

$ffmpeg = 'D:\\org\\ffmpeg\\bin\\ffmpeg.exe';
$video = 'C:\\py\\test1.mp4';
get_video_times($ffmpeg, $video);// return 00:24:28

固然,你也能夠優化,如方法裏面能夠用正則截取時間,減小代碼;能夠截出小時分鐘爲0的返回值;ide

其次,這個方法稍微改進下,即可獲取視頻的建立時間等信息。具體實現,你們能夠foreach循環外打印 $str_res ,進一步截取本身須要的信息。 我的打印$str_res的結果以下:post

Array
(
    [0] => ffmpeg version N-86537-gae6f6d4 Copyright (c) 2000-2017 the FFmpeg developers
    [1] =>   built with gcc 7.1.0 (GCC)
    [2] =>   configuration: --disable-static --enable-shared --enable-gpl --enable-version3 --enable-cuda --enable-cuvid --enable-d3d11va --enable-dxva2 --enable-libmfx --enable-nvenc --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzimg --enable-lzma --enable-zlib
    [3] =>   libavutil      55. 66.100 / 55. 66.100
    [4] =>   libavcodec     57. 99.100 / 57. 99.100
    [5] =>   libavformat    57. 73.100 / 57. 73.100
    [6] =>   libavdevice    57.  7.100 / 57.  7.100
    [7] =>   libavfilter     6. 94.100 /  6. 94.100
    [8] =>   libswscale      4.  7.101 /  4.  7.101
    [9] =>   libswresample   2.  8.100 /  2.  8.100
    [10] =>   libpostproc    54.  6.100 / 54.  6.100
    [11] => Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'C:\py\test1.mp4':
    [12] =>   Metadata:
    [13] =>     major_brand     : M4V
    [14] =>     minor_version   : 1
    [15] =>     compatible_brands: isomM4A M4V mp42
    [16] =>     creation_time   : 2015-08-29T17:50:15.000000Z
    [17] =>   Duration: 00:24:28.14, start: 0.000000, bitrate: 486 kb/s
    [18] =>     Stream #0:0(und): Video: mpeg4 (Simple Profile) (mp4v / 0x7634706D), yuv420p, 1080x812 [SAR 150:149 DAR 40500:30247], 442 kb/s, SAR 406:405 DAR 4:3, 15 fps, 15 tbr, 15k tbn, 15 tbc (default)
    [19] =>     Metadata:
    [20] =>       creation_time   : 2015-08-29T17:50:15.000000Z
    [21] =>       handler_name    : avi#video:fps=15:par=406:405@GPAC0.5.2-DEV-rev387-g3102094-master
    [22] =>     Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 41 kb/s (default)
    [23] =>     Metadata:
    [24] =>       creation_time   : 2015-08-29T17:48:55.000000Z
    [25] =>       handler_name    : Sound Media Handler
    [26] => At least one output file must be specified
)

4、獲取縮略圖優化

/*獲取視頻縮略圖
$videopath : 視頻絕對地址
$imgpath : 縮略圖保存地址
$time : 截取第幾幀爲縮略圖
*/
function get_img_by_video($ffempeg_path, $videopath, $imgpath, $time = 1) {

       if (! file_exists($videopath)) return false;
       if (strpos(PHP_OS, 'WIN') !== false){ //windows系統
           $str = "{$ffempeg_path} -i {$videopath} -y -f mjpeg -ss 3 -t {$time} -s 300x200 {$imgpath}";
           return system($str);
       }
}
相關文章
相關標籤/搜索