本文分享了在使用FFmpeg实现视频截图并上传功能时的安装与排错经验,重点讲解了如何通过安装FFmpeg和yasm实现视频第一帧的截取,并提供了PHP代码示例和常见问题解决方案,适合开发者参考学习。

文章标题:FFmpeg视频截图上传功能实现与排错经验分享(含临界区关键步骤)

文章内容:

最近在公司项目中,我们需要实现用户上传视频并自动获取视频第一帧作为封面的功能。经过一番摸索,我发现虽然尝试安装了ffmpeg-php扩展,但由于版本兼容性问题屡屡失败。最终,我放弃了扩展安装,转而采用直接安装FFmpeg和yasm的方式,惊喜地发现无需扩展也能成功实现截图和上传。下面我将详细分享这一过程,特别是涉及临界区安装的关键步骤和代码实现。

首先,我们从FFmpeg的官方下载链接获取安装包:http://ffmpeg.org/download.html

1. 解压安装包

使用命令:tar -jxvf ffmpeg-x.x.tar.bz2

2. 进入目录

cd ffmpeg-x.x

3. 编译安装

./configure --enable-shared && make && make install

安装过程中可能会遇到这个报错:

“nasm/yasm not found or too old. Use –disable-x86asm for a crippled build.”

这个错误提示我们需要先安装yasm。yasm的下载链接是:http://yasm.tortall.net/Download.html

4. 安装yasm

下载yasm后上传到服务器的local目录,解压并执行:

tar -zxvf yasm.tar.gz

cd yasm-1.3.0/

./configure && make &&& make install

这里要注意临界区的处理,确保yasm安装完成后再继续FFmpeg的安装。

5. 完成FFmpeg安装

返回FFmpeg目录继续执行安装命令,这可能需要几分钟时间。

6. 解决动态链接库问题

如果出现”ffmpeg: error while loading shared libraries…”错误,需要编辑/etc/ld.so.conf文件,在include ld.so.conf.d/.conf这行下方添加:

/usr/local/ffmpeg-4.0.2

保存后执行ldconfig命令,再检验是否安装成功。

二、PHP环境配置

为了执行系统命令,我们需要修改php.ini文件,禁用安全限制。

1. 编辑php.ini

cd /usr/local/php/etc
vi php.ini

2. 禁用以下函数(删除或注释掉):

exec, system, shell_exec, proc_open, proc_get_status

3. 重启PHP服务

service php-fpm restart

三、PHP代码实现

以下是基于ThinkPHP5框架的实现代码,主要分为接收视频、截图和上传三个步骤。

1. 接收视频文件

$video = request()->file('video');

2. 处理视频并截图

if(!empty($video)) {
$info = $video->move(ROOT_PATH . 'public' . DS . 'uploads');
if($info) {
$videoName = $info->getSaveName();
$source = '/uploads/' .$videoName;
$dir = ROOT_PATH . 'public' . DS . 'uploads/'; //上传目录
$fileName = str_replace('.mp4','.jpg',$videoName);
$video_filePath = $dir.$videoName;

// 使用ffmpeg截取第一帧
$str = "ffmpeg -i ".$video_filePath." -y -f mjpeg -ss 1 -t 0.001 -s 348470 ".$dir.$fileName;
exec($str,$out,$status);

// 处理图片
$datas['video'] = $source;
$datas['picture'] = '/uploads/' . $fileName;
$image = thinkImage::open('. '.$datas['picture']);
$width = $image->width();
$height = $image->height();
$water = $dir.'water.png'; //播放按钮图片
$image->water($water,thinkImage::WATER_NORTHWEST,50)->save('. '.$datas['picture']);
}
}

3. 封装截图方法(推荐)

/
截取视频第一帧

@param $file 视频文件
@param $time 第几帧
@param $dir 临时目录
@param $size 截图尺寸
/
public function getVideoCover($file,$time,$dir,$size) {
$time = $time ? $time : '1'; //默认截取第一秒第一帧
$size = $size ? $size : '348470';
$fileName = getImgName();
$tempfiles = $dir.$fileName.'.mp4';
$bool = move_uploaded_file($file, $tempfiles);
$str = "ffmpeg -i ".$tempfiles." -y -f mjpeg -ss ".$time." -t 0.001 -s $size ".$dir.$fileName.'.jpg';
exec($str,$out,$status);
return $fileName;
}

4. 数据库存储

将视频和封面图片的路径存储到数据库中,整个流程就完成了。

总结:通过以上步骤,我们成功实现了视频上传时自动截取第一帧的功能。关键在于正确安装FFmpeg和yasm,并处理好临界区的依赖关系。希望这个分享能帮助到遇到类似问题的开发者。

{1、FFmpeg, 2、视频截图, 3、PHP上传, 4、临界区处理, 5、系统命令, 6、ThinkPHP, 7、视频处理, 8、服务器配置, 9、开发经验, 10、技术教程}


本文是基于《做项目时实现视频截图并上传功能的安装与排错经验分享》的AI重写版本

免责声明:本站为个人博客,博客所发布的一切修改补丁、注册机和注册信息及软件的文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关,您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。 访问和下载本站内容,说明您已同意上述条款。本站为非盈利性站点,VIP功能仅仅作为用户喜欢本站捐赠打赏功能,本站不贩卖软件,所有内容不作为商业行为。