HYBBS使用FFmpeg实现视频上传截取封面

模板插件 645 2020-05-29 22:51  

环境

centos 7

hybbs 2.3.2

FFMPEG介绍

FFmpeg 是一个很强大的音视频处理工具,官网介绍 FFmpeg 是:一个完整的、跨平台的解决方案,可以记录、转换和传输音频和视频。FFmpeg既可以播放视频,也提供命令行工具来处理视频,另外还有强大的视频处理库用于开发,下面是以 Linux 为例介绍 FFmpeg 的安装流程的简单的命令行对视频进行转码操作,是 FFmpeg 中最最简单的入门内容

FFmpeg 官网地址:http://ffmpeg.org/

FFMPEG安装

cd /usr/local/src
wget https://ffmpeg.org/releases/ffmpeg-4.2.3.tar.gz
tar -zxvf ffmpeg-4.2.3.tar.gz
cd ffmpeg-4.2.3
./configure --enable-shared --prefix=/usr/local/ffmpeg
make  make install

--enable-shared 参数据说是允许其编译产生动态库,在以后的编程中要用到这个几个动态库
--prefix 用于设置 FFmpeg 的安装目录,目前使用过来如果设置后再进行 ffmpeg-php 安装时会出现需要 --enable-shared

安装时异常:提示因为缺少 yasm 或者该包旧了,执行以下命令安装 yasm

yum -y install yasm

安装之后运行

在 /usr/local/ffmpeg 会看到有如下几个目录

  1. bin 执行文件目录
  2. lib 静态,动态链接库目录
  3. include 编程用到的头文件
  4. share 文档目录

配置库目录到系统中

然后进入 bin 目录,执行 ./ffmpeg -version 查看当前版本的详细信息,默认情况下一般会报:

libavdevice.so.57: cannot open shared object file: No such file or directory ...

原因是 lib 目录未加载到链接到系统库中,系统库配置文件 /etc/ld.so.conf ,打开后你会发现里面引用了 /etc/ld.so.conf.d/ 下面所有的 *.conf 文件,所以我们只需执行以下命令:

vim /etc/ld.so.conf.d/ffmpeg.conf

然后添加一行内容:

/usr/local/ffmpeg/lib

之后保存并退出,然后执行 ldconfig 使配置生效,现在再次执行 ./ffmpeg -version 显示就正常了。

ldconfig 是一个动态链接库管理命令,其目的为了让动态链接库为系统所共享
ldconfig 的主要用途:默认搜寻/lilb和/usr/lib,以及配置文件/etc/ld.so.conf内所列的目录下的库文件

配置执行文件到系统中

然后我们可以将这个 bin 目录添加至环境变量中以保证任何时候在任何目录中都能使用 ffmpeg 命令,操作步骤如下:

ln -s /usr/local/ffmpeg/bin/ffmpeg /usr/bin

HYBBS视频上传代码替换

找到Action/Post.php视频上传函数将以下代码:

//{hook a_post_uploadvideo_33}
			$File = S('File');
        	$File->insert(array(
        		'uid'		=>	NOW_UID,
        		'filename'	=>	filter_html(isset($info['video'])?$info['video']['name']:'未命名.'.$info['video']['ext']),
        		'md5name'	=>	$upload->saveName.'.'.$info['video']['ext'],
        		'md5'		=>	$upload->saveName,
        		'filesize'	=>	$info['video']['size'],
        		'file_type'	=>	3,//视频
        		'atime'		=>	NOW_TIME
        	));

替换为:

//保存截图
 $ffmpeg_cmd ="ffmpeg -i " . INDEX_PATH . $UserTmpUploadPath . $info['video']['savename'] . " -y -c:v copy -c:a copy " . INDEX_PATH . $UserTmpUploadPath . $upload->saveName . ".mp4";
exec($ffmpeg_cmd);

$thumb_file =INDEX_PATH . $UserTmpUploadPath . $upload->saveName . '.jpg';
$cmd ="ffmpeg -i " . INDEX_PATH . $UserTmpUploadPath . $info['video']['savename'] . " -y -f mjpeg -ss 1 -t 0.005 -vf \"thumbnail,scale=iw:ih\" -vframes 1 " . $thumb_file;
exec($cmd);
$ffmpeg_i = "ffmpeg -i " . INDEX_PATH . $UserTmpUploadPath . $info['video']['savename'] . " 2>1 | grep Duration"; 
exec($ffmpeg_i, $output);
$duration = ''; 
if (!empty($output)) { 
    $duration_line = explode(',', $output[0]); 
    if (!empty($duration_line)) { 
        $duration = trim(str_replace('Duration:', '', $duration_line[0])); 
        $duration = substr($duration, 0, 8); // 只保留时分秒部分
    } 
}
$File = S('File');
        	$File->insert(array(
        		'uid'		=>	NOW_UID,
        		'filename'	=>	filter_html(isset($info['video'])?$info['video']['name']:'未命名.'.$info['video']['ext']),
        		'md5name'	=>	$upload->saveName.'.'.$info['video']['ext'],
        		'md5'		=>	$upload->saveName,
        		'filesize'	=>	$info['video']['size'],
        		'file_type'	=>	3,//视频
        		'atime'		=>	NOW_TIME,
        		'time'	=> $duration
        	));
$json['duration'] = $duration;
$json['file_path'] = WWW . $UserTmpUploadPath .$info['video']['savename'];
$json['file_path']=WWW . $UserTmpUploadPath .$upload->saveName . '.mp4'; // 转换后的视频
$json['thumb_path']=WWW . $UserTmpUploadPath . $upload->saveName . '.jpg'; // 视频缩略图

教程来源于网络

https://uer.cc/archives/215.html

admin 管理员 楼主
美化部分UI更多功能待定呃哈哈

全部回复

  12 正序
  • admin 管理员 1 Floor

咳咳

3个月前 0 0
  • admin 管理员 2 Floor

kk

3个月前 0 0
  • admin 管理员 3 Floor

xf

3个月前 0 0
  • admin 管理员 4 Floor

dd

3个月前 0 0
  • admin 管理员 5 Floor

kk

3个月前 0 0
  • admin 管理员 6 Floor

kk

3个月前 0 0
  • admin 管理员 7 Floor

3个月前 0 0
  • admin 管理员 8 Floor

康康

3个月前 0 0
  • admin 管理员 9 Floor

康康

3个月前 0 0
  • admin 管理员 10 Floor

咳咳

3个月前 0 0
Need Login