当前位置:首页 > PHP教程 > php高级应用 > 列表

PHP利用FFmpeg实现获取远程视频的时长和截图

发布:smiling 来源: PHP粉丝网  添加日期:2024-09-26 21:04:50 浏览: 评论:0 

突然发现 FFmpeg 这个软件还可以直接拉取远程视频的相关信息,也就是可以不通过下载视频到本地的方式,直接远程去获取视频时长和截图。

假设我们的视频url是:http://my.com/a.mp4

第一步,Linux 安装 FFmpeg 软件

第二步,通过composer安装FFmpeg的库

composer require php-ffmpeg/php-ffmpeg

1、获取远程视频时长

  1. use FFMpeg\FFMpeg; 
  2.  
  3. require 'vendor/autoload.php'
  4.  
  5. $ffmpeg = FFMpeg::create(); 
  6.  
  7. $video = $ffmpeg->open('https://xxx.mp4'); 
  8.  
  9. // 获取视频的时长(秒) 
  10.  
  11. $duration = $video->getStreams()->first()->get('duration'); 

2、获取远程视频的第一帧

  1. use FFMpeg\Coordinate\TimeCode; 
  2.  
  3. use FFMpeg\FFMpeg; 
  4.  
  5. require 'vendor/autoload.php'
  6.  
  7. $ffmpeg = FFMpeg::create(); 
  8.  
  9. $video = $ffmpeg->open('https://xxx.mp4'); 
  10.  
  11. // 获取视频的时长(秒) 
  12.  
  13. $duration = $video->getStreams()->first()->get('duration'); 
  14.  
  15. echo $duration
  16.  
  17. $outputImage = '/data/b.jpg';  // 替换为您希望保存第一帧的物理路径 
  18.  
  19. // 提取第一帧(默认情况下,FFMpeg库将从视频的开始处获取第一帧) 
  20.  
  21. $frame = $video->frame(TimeCode::fromSeconds(0));    
  22.  
  23. // 将第一帧保存到指定的图像文件 
  24.  
  25. $frame->save($outputImage'image/jpeg'); 

经测试,以上过程的调用,并不需要完全把视频下载到本地再解析,可以实现远程获取直接秒级返回!

3.知识补充

除了上文的方法,小编还为大家整理了一些其他PHP关于视频文件的相关操作,希望对大家有所帮助

php 利用服务器liunx 获取 视频、音频 时长,封面图

  1. /** 
  2.  
  3.  * 利用服务器ffmpeg命令截取视频帧数 
  4.  
  5.  * @param string $local_file_url 服务器文件路径,以./开头 
  6.  
  7.  * @param string $screenshot_local_file_url 保存的视频截帧图片路径,以./开头 
  8.  
  9.  * @param string $time 截取视频秒数 
  10.  
  11.  * @date 2021-06-24 
  12.  
  13.  */ 
  14.  
  15. function get_video_screenshot_by_ffmpeg($local_file_url$screenshot_local_file_url$time = 0) 
  16.  
  17.  
  18.     $str = 'ffmpeg -i ' . $local_file_url . ' -y -f image2 -ss ' . $time . ' -t 0.001 ' . $screenshot_local_file_url
  19.  
  20.     exec($str); 
  21.  
  22.   
  23.  
  24.     return $screenshot_local_file_url
  25.  
  26. }

获得视频文件的总长度时间和创建时间

  1. function get_video_time($local_file_url){ 
  2.  
  3.     $vtime = exec("ffmpeg -i ".$local_file_url." 2>&1 | grep 'Duration' | cut -d ' ' -f 4 | sed s/,//");//总长度 
  4.  
  5.     $duration = explode(":",$vtime); 
  6.  
  7.     $duration_in_secOnds$duration[0]*3600 + $duration[1]*60+ round($duration[2]);//转化为秒 
  8.  
  9.     return $duration_in_secOnds
  10.  

PHP使用ffmpeg获取视频的时长和截取视频图片

  1. // 获取上传的视频斜体样式 
  2.  
  3. $files$_FILES[‘file']; 
  4.  
  5. function upload_video($files){ 
  6.  
  7.     // 判断上传是否正常 
  8.  
  9.     if ($files['error'] == 0){ 
  10.  
  11.       
  12.  
  13.         $ext = strtolower(pathinfo(@$files['name'],PATHINFO_EXTENSION));// 截取上传的视频后缀 
  14.  
  15.         $allowExts = array("vob","ifo","mpg","mpeg","dat","mp4","3gp","mov","rm","ram","rmvb","wmv","asf","avi","asx");// 设置允许上传的视频后缀 
  16.  
  17.         $path = '../asj/video/'// 设置附件上传保持目录 
  18.  
  19.         if (!in_array($ext$allowExts)){ 
  20.  
  21.             // 判断上传视频后缀是否符合 
  22.  
  23.             $result = ['data' => '''code' => -1, 'message' => '非法文件类型!']; 
  24.  
  25.         }else
  26.  
  27.             $fileName = date('Ymd').time();// 设置视频新的名称 
  28.  
  29.             $destName = $path.$fileName.".".$ext;// 保存视频到指定路径 
  30.  
  31.             // 判断视频上传是否成功 
  32.  
  33.             if (!move_uploaded_file($files['tmp_name'], $destName)){ 
  34.  
  35.                 $result = ['data' => '''code' => -1, 'message' => '文件上传失败!']; 
  36.  
  37.             }else
  38.  
  39.                 $outdata = array(); 
  40.  
  41.                 $outdata['path'] = "video/$fileName.$ext"
  42.  
  43.                 $ffmpeg = 'C:\\Windows\\System32\\ffmpeg\\bin\\ffmpeg.exe';// ffmpeg安装的路径 
  44.  
  45.                 // 获取视频的相关信息 
  46.  
  47.                 $data = get_video_info($ffmpeg$destName$fileName); 
  48.  
  49.                 $outdata['time'] = $data['time']; 
  50.  
  51.                 $outdata['img'] = $data['img']; 
  52.  
  53.                 $result = ['data' => $outdata'code' => 200, 'message' => '文件上传成功!']; 
  54.  
  55.             } 
  56.  
  57.         } 
  58.  
  59.     }else
  60.  
  61.         switch (@$files['error']) { 
  62.  
  63.             case 1: 
  64.  
  65.                 $msg = "上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值!"
  66.  
  67.                 break
  68.  
  69.             case 2: 
  70.  
  71.                 $msg = "上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值!"
  72.  
  73.                 break
  74.  
  75.             case 3: 
  76.  
  77.                 $msg = "文件只有部分被上传!"
  78.  
  79.                 break
  80.  
  81.             case 4: 
  82.  
  83.                 $msg = "没有文件被上传!"
  84.  
  85.                 break
  86.  
  87.             case 6: 
  88.  
  89.             case 7: 
  90.  
  91.                 $msg = "系统错误!"
  92.  
  93.                 break
  94.  
  95.         } 
  96.  
  97.         $result = ['data' => '''code' => -1, 'message' => $msg]; 
  98.  
  99.     } 

如果exec()未正确返回参照

  1. /** 
  2.  
  3. 获取视频的相关信息 
  4.  
  5. @param $ffmpeg_path// ffmpeg.exe路径 
  6.  
  7. @param $video_path// 视频的路径 
  8.  
  9. @param $fileName// 保存的图片名称和视频的新名称一致 
  10.  
  11. @return array 
  12.  
  13. */ 
  14.  
  15. function get_video_info($ffmpeg_path$video_path$fileName){ 
  16.  
  17. if (!file_exists($video_path)) { 
  18.  
  19.     return false; 
  20.  
  21.  
  22. // 获取视频时长信息    
  23.  
  24. $commond = " $ffmpeg_path -i $video_path 2>&1"
  25.  
  26. exec($commond$str_res$str_r); 
  27.  
  28. if (is_array($str_res)){ 
  29.  
  30.     foreach($str_res as $v){ 
  31.  
  32.       
  33.  
  34.         if (strpos$v'Duration') !== false){ 
  35.  
  36.           
  37.  
  38.             $times = substr($vstripos($v , '.') - 8, 8);// 截取时分秒 
  39.  
  40.             $arr_duration = explode(':'$times);// 转出相应的数组 
  41.  
  42.             $seconds = $arr_duration[0] * 3600 + $arr_duration[1] * 60 + $arr_duration[2];//转换播放时间为秒数 
  43.  
  44.             break
  45.  
  46.         } 
  47.  
  48.     } 
  49.  
  50.  
  51. // 截取视频图片 
  52.  
  53. $time = 1;// 根据时间截取视频的图片 
  54.  
  55. $img_url = "..\\asj\\video\\imgs\\$fileName.jpg"
  56.  
  57. $img_name = "video/imgs/ $fileName.jpg"
  58.  
  59. exec(" $ffmpeg_path -i $video_path -f image2 -ss $time -s 320x240 -vframes 1 $img_url"$out$status); 
  60.  
  61. $outdata = array(); 
  62.  
  63. $outdata['time'] = $seconds;// 秒数 
  64.  
  65. $outdata['img'] = $img_name
  66.  
  67. return $outdata

到此这篇关于PHP利用FFmpeg实现获取远程视频的时长和截图的文章就介绍到这了。

Tags: PHP利用FFmpeg实现获取远程视频的时长和截图

分享到: