2026/4/6 11:58:09
网站建设
项目流程
突然发现 FFmpeg 这个软件还可以直接拉取远程视频的相关信息也就是可以不通过下载视频到本地的方式直接远程去获取视频时长和截图。假设我们的视频url是http://my.com/a.mp4第一步Linux 安装 FFmpeg 软件第二步通过composer安装FFmpeg的库composer require php-ffmpeg/php-ffmpeg1、获取远程视频时长123456789useFFMpeg\FFMpeg;requirevendor/autoload.php;$ffmpeg FFMpeg::create();$video$ffmpeg-open(https://xxx.mp4);// 获取视频的时长秒$duration$video-getStreams()-first()-get(duration);2、获取远程视频的第一帧12345678910111213141516171819useFFMpeg\Coordinate\TimeCode;useFFMpeg\FFMpeg;requirevendor/autoload.php;$ffmpeg FFMpeg::create();$video$ffmpeg-open(https://xxx.mp4);// 获取视频的时长秒$duration$video-getStreams()-first()-get(duration);echo$duration;$outputImage/data/b.jpg;// 替换为您希望保存第一帧的物理路径// 提取第一帧默认情况下FFMpeg库将从视频的开始处获取第一帧$frame$video-frame(TimeCode::fromSeconds(0));// 将第一帧保存到指定的图像文件$frame-save($outputImage,image/jpeg);经测试以上过程的调用并不需要完全把视频下载到本地再解析可以实现远程获取直接秒级返回3.知识补充除了上文的方法小编还为大家整理了一些其他PHP关于视频文件的相关操作希望对大家有所帮助php 利用服务器liunx 获取 视频、音频 时长封面图1234567891011121314/*** 利用服务器ffmpeg命令截取视频帧数* param string $local_file_url 服务器文件路径以./开头* param string $screenshot_local_file_url 保存的视频截帧图片路径以./开头* param string $time 截取视频秒数* date 2021-06-24*/functionget_video_screenshot_by_ffmpeg($local_file_url,$screenshot_local_file_url,$time 0){$strffmpeg -i .$local_file_url. -y -f image2 -ss .$time. -t 0.001 .$screenshot_local_file_url;exec($str);return$screenshot_local_file_url;}1234567//获得视频文件的总长度时间和创建时间functionget_video_time($local_file_url){$vtimeexec(ffmpeg -i .$local_file_url. 21 | grep Duration | cut -d -f 4 | sed s/,//);//总长度$durationexplode(:,$vtime);$duration_in_secOnds$duration[0]*3600 $duration[1]*60round($duration[2]);//转化为秒return$duration_in_secOnds;}PHP使用ffmpeg获取视频的时长和截取视频图片12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152// 获取上传的视频斜体样式$files$_FILES[‘file];functionupload_video($files){// 判断上传是否正常if($files[error] 0){$extstrtolower(pathinfo($files[name],PATHINFO_EXTENSION));// 截取上传的视频后缀$allowExtsarray(vob,ifo,mpg,mpeg,dat,mp4,3gp,mov,rm,ram,rmvb,wmv,asf,avi,asx);// 设置允许上传的视频后缀$path../asj/video/;// 设置附件上传保持目录if(!in_array($ext,$allowExts)){// 判断上传视频后缀是否符合$result [data,code -1,message非法文件类型];}else{$fileNamedate(Ymd).time();// 设置视频新的名称$destName$path.$fileName...$ext;// 保存视频到指定路径// 判断视频上传是否成功if(!move_uploaded_file($files[tmp_name],$destName)){$result [data,code -1,message文件上传失败];}else{$outdataarray();$outdata[path] video/$fileName.$ext;$ffmpegC:\\Windows\\System32\\ffmpeg\\bin\\ffmpeg.exe;// ffmpeg安装的路径// 获取视频的相关信息$data get_video_info($ffmpeg,$destName,$fileName);$outdata[time] $data[time];$outdata[img] $data[img];$result [data$outdata,code 200,message文件上传成功];}}}else{switch($files[error]) {case1:$msg上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值!;break;case2:$msg上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值;break;case3:$msg文件只有部分被上传;break;case4:$msg没有文件被上传;break;case6:case7:$msg系统错误;break;}$result [data,code -1,message$msg];}如果exec()未正确返回参照12345678910111213141516171819202122232425262728293031323334353637383940414243/**获取视频的相关信息param $ffmpeg_path// ffmpeg.exe路径param $video_path// 视频的路径param $fileName// 保存的图片名称和视频的新名称一致return array*/functionget_video_info($ffmpeg_path,$video_path,$fileName){if(!file_exists($video_path)) {returnfalse;}// 获取视频时长信息$commond $ffmpeg_path -i $video_path 21;exec($commond,$str_res,$str_r);if(is_array($str_res)){foreach($str_resas$v){if(strpos($v,Duration) ! false){$timessubstr($v,stripos($v,.) - 8, 8);// 截取时分秒$arr_durationexplode(:,$times);// 转出相应的数组$seconds$arr_duration[0] * 3600 $arr_duration[1] * 60 $arr_duration[2];//转换播放时间为秒数break;}}}// 截取视频图片$time 1;// 根据时间截取视频的图片$img_url..\\asj\\video\\imgs\\$fileName.jpg;$img_namevideo/imgs/ $fileName.jpg;exec( $ffmpeg_path -i $video_path -f image2 -ss $time -s 320x240 -vframes 1 $img_url,$out,$status);$outdataarray();$outdata[time] $seconds;// 秒数$outdata[img] $img_name;return$outdata;到此这篇关于PHP利用FFmpeg实现获取远程视频的时长和截图的文章就介绍到这了