话不多说 上代码 各位看官 参考吧

require 'vedio.ext.php';

    $file = '文件地址 绝对路径';
    $video = new videoExt();

    $file_info = pathinfo($file);
    $video_id = $file_info['filename']; // 视频名作为视频的id

    $tmp_dir = ''; // 切片的临时目录绝对路径

    if (!file_exists($tmp_dir)) {
        mkdir($tmp_dir, 0777, true);
    }


    //如果临时目录不为空,清空目录
    $tmp_dir_files = scandir($tmp_dir);
    $tmp_dir_files = array_diff($tmp_dir_files, ['..', '.']);
    if (!empty($tmp_dir_files)) {
        foreach ($tmp_dir_files as $key => $tmp_file) {
            unlink($tmp_dir . $tmp_file);
        }
    }

    $compressed_video = $tmp_dir.$video_id.'.mp4'; // 压缩后的视频

    $video->compress($file, $compressed_video); // 压缩视频
    // ts文件的远程存放地址
    $remote_url = $tmp_dir.$video_id;
    $remote_preview_url = $tmp_dir.$video_id.DIRECTORY_SEPARATOR.'auto';


    $duration = $video->get_duration($compressed_video); // 获取视频时长
    $video_cover = $video->get_cover($compressed_video, 5, $tmp_dir); // 获取视频图片

    // 切片
    $m3u8_file = $video->m3u8($compressed_video, 5, $remote_url, $tmp_dir); // 视频切片

      

    unlink($video_cover);

     unlink($m3u8_file);

    

   // 生成5分钟预览
   $preview_m3u8_file = $video->m3u8($compressed_video, 5, $remote_preview_url, $tmp_dir, 30);

 

vedio.ext.php 文件

<?php
/*
* 视频扩展类, 该类主要用于下载视频, 处理视频(获取视频信息, 压缩, 合并, 切片, 截屏等)操作
*/
class videoExt
{

    /**
     * 断点下载远程文件
     * @param string $remote_file 远程文件url, 如 http://video.sanhao.com/video/opencourse/204/204.mp4
     * @param string $local_dir 本地路径, 如 /usr/share/nginx/html/php_services/data/video_slice/
     * @param string $filename 文件名, 如 212.mp4
     * @return bool
     * @throws Exception
     */
    public function download($remote_file, $local_dir, $filename)
    {
        if (!file_exists($local_dir)) {
            mkdir($local_dir, 0777, true);
        }
        try {
            $remote_file_pointer = fopen($remote_file, 'rb');
            $local_file_pointer = fopen($local_dir . $filename, 'wb');

            while (!feof($remote_file_pointer)) {
                $tmp = fread($remote_file_pointer, 8192); // 每次下载8M
                fwrite($local_file_pointer, $tmp);
            }

            fclose($remote_file_pointer);
            fclose($local_file_pointer);
            return true;
        } catch (Exception $e) {
            throw new Exception($e->getMessage(), $e->getCode());
        }
    }

    /**
     * 获取视频长度,单位为秒
     * @param string $filename 视频文件的绝对路径, 如/usr/share/nginx/html/data/video_slice/212.mp4
     * @return int $time
     */
    public function get_duration($filename)
    {
        $cmd = 'ffmpeg -i ' . $filename . ' 2>&1 | grep \'Duration\' | cut -d \' \' -f 4 | sed s/,//';
        $content = exec($cmd);
        if (!$content || $content == '') return 0;
        $tmp = explode(':', $content);
        $time = $tmp[0] * 3600 + $tmp[1] * 60 + intval($tmp[2]);
        return $time;
    }

    /**
     * 生成视频略缩图, 默认取第5秒, 返回略缩图的绝对路径
     * @param string $filename 文件的绝对路径
     * @param int $time 截取时间
     * @param string $dist_dir 缩略图的绝对存储路径
     * @return string
     */
    public function get_cover($filename, $time = 5, $dist_dir)
    {
        $file_info = pathinfo($filename);
        $cover_file = $dist_dir . $file_info['filename'] . '.jpg';
        exec("ffmpeg -i " . $filename . " -y -f mjpeg -ss " . $time . " -t 0.001 " . $cover_file . "");
        return $cover_file;
    }

    /**
     * 压缩视频, 减少视频体积
     * @param string $filename 文件的绝对路径
     * @param string $new_filename 压缩文件的绝对路径
     */
    public function compress($filename, $new_filename)
    {
        $cmd = 'ffmpeg -i ' . $filename . ' -c:v libx264 -crf 18 ' . $new_filename;
        exec($cmd);
    }

    /**
     * 视频切片, 默认切片大小为5秒, 返回m3u8文件的绝对路径
     * @param string $filename 文件的绝对路径
     * @param int $interval 切片长度
     * @param string $remote_url 远程访问地址, 只到目录层,
     * 如完整路径为       http://video.sanhao.com/dev/record/204/204-001.ts
     * 那么$remote_url为 http://video.sanhao.com/dev/record/204/
     * @param string $dist_dir 本地存储ts文件和m3u8文件的绝对路径
     * @param int $duration 总切片长度,单位秒
     * @return string
     */
//        public function m3u8($filename, $interval = 5, $remote_url, $dist_dir){
//            $file_info = pathinfo($filename);
//            $transfer_ts_file = $dist_dir . $file_info['filename'] .'.ts';
//            $m3u8_file = $dist_dir . $file_info['filename'] .'.m3u8';
//            $cmd = 'ffmpeg -i '. $filename . ' -vcodec libx264 -crf 18 '. $transfer_ts_file;
//            $rs = exec($cmd);
//
//            $cmd = 'ffmpeg -i '. $transfer_ts_file .' -c copy -map 0  -f segment -segment_list '. $m3u8_file;
//            $cmd .= ' -segment_time '. $interval .' -segment_list_entry_prefix '. $remote_url . ' ';
//            $cmd .=  $dist_dir . $file_info['filename'] .'-%03d.ts';
//            $rs = exec($cmd);
//            @unlink($transfer_ts_file);
//            return $m3u8_file;
//        }

    public function m3u8($filename, $interval = 5, $remote_url, $dist_dir, $duration = 0)
    {
        $file_info = pathinfo($filename);
        $m3u8_file = $dist_dir . $file_info['filename'] . '.m3u8';
        $cmd = 'ffmpeg ';
        if ($duration > 0) {
            $time = $this->seconds2time($duration);
            $cmd .= '-ss 0 -t '.$time.' ';
        }
        $cmd .= '-i ' . $filename . ' -c copy -map 0  -f segment -segment_list ' . $m3u8_file;
        $cmd .= ' -segment_time ' . $interval . ' -segment_list_entry_prefix ' . $remote_url . ' ';
        $cmd .= $dist_dir . $file_info['filename'] . '-%03d.ts';
        $rs = exec($cmd);
        return $m3u8_file;
    }


    /**
     * 把秒数转换为时分秒的格式
     * @param int $times 秒数
     * @return string 时分秒字符串
     */
    public function seconds2time($times)
    {
        $result = '00:00:00';
        if ($times > 0) {
            $hour = floor($times / 3600);
            $minute = floor(($times - 3600 * $hour) / 60);
            $second = floor((($times - 3600 * $hour) - 60 * $minute) % 60);
            $result = $hour . ':' . $minute . ':' . $second;
        }
        return $result;
    }
}

 

    ffmpeg操作类
<?php
/*
 * ffmpeg操作类
 */
class ffmpeg{

    //视频长度
    public static function len($room_no, $name){
        $cmd = 'ffmpeg -i '.DATA.$room_no.DIRECTORY_SEPARATOR.$name.'.mp4 2>&1 | grep \'Duration\' | cut -d \' \' -f 4 | sed s/,//';
//            var_dump($cmd);
        $content = exec($cmd);
        if(!$content || $content == '') return 0;
        $tmp = explode(':', $content);
        $time = $tmp[0]*3600 + $tmp[1]*60 + intval($tmp[2]);
        return $time;
    }

    //视频复制
    public static function copy($room_no, $name, $file){
        $cmd = 'ffmpeg -i '.$file.' -s 320*240 '.DATA.$room_no.DIRECTORY_SEPARATOR.$name.'.mp4';
//            SayTool::log($cmd);
        return exec($cmd);
    }

    //视频删除
    public static function rm($room_no, $name){
        return unlink(DATA.$room_no.DIRECTORY_SEPARATOR.$name.'.mp4');
    }

    //视频切片
    public static function m3u8($room_no){
        $room_id = str_replace('sanhao', '', $room_no);
        //转换成ts
        $cmd = 'ffmpeg -i '.DATA.$room_no.DIRECTORY_SEPARATOR.$room_no.'.mp4 -vcodec libx264 '.DATA.$room_no.DIRECTORY_SEPARATOR.$room_no.'.ts';
        var_dump($cmd);
        $rs = exec($cmd);
        //切片视频
        $cmd = 'segmenter -i '.DATA.$room_no.DIRECTORY_SEPARATOR.$room_no.'.ts -d 10 -p '.DATA.$room_no.DIRECTORY_SEPARATOR.'m3u8/video -m '.DATA.$room_no.DIRECTORY_SEPARATOR.$room_id.'.m3u8 -u http://video.sanhao.com/record/';
        var_dump($cmd);
        $rs = exec($cmd);
    }
}

PHP 利用FFmpeg 视频切片的更多相关文章

  1. HTML5 播放 RTSP 视频的实例代码

    目前大多数网络摄像头都是通过 RTSP 协议传输视频流的,但是 HTML 并不标准支持 RTSP 流。本文重点给大家介绍HTML5 播放 RTSP 视频的实例代码,需要的朋友参考下吧

  2. ios – 从Live Photo中提取视频部分

    有没有人想出如何从LivePhoto中提取视频部分?

  3. ios – 使用Swift的Lumberjack 2.0记录器

    我以前使用物镜C的Lumberjack记录器,我喜欢它.现在我开始学习Swift,我不能在那里使用我最喜欢的记录器.有人可以一步一步地写出我能做到的事吗?在Lumberjack2.0发布之前,我尝试在这里找到一些东西,但所有主题都是自定义包装器.我做了什么:>我用Cocoapods添加了Lumberjack;>我将“#import”添加到Bridging-Header文件中.我不知道接下来该怎么办?因为在ObjC中我有宏:staticconstintddLogLevel=LOG_LEVEL_INFO;el

  4. xcode4 – 如何将分组的(本地化)文件的位置从XCode 4中的绝对路径更改为相对路径?

    我已经尝试将文件组的路径位置更改为例如“相对于组”或“相对于项目”.对于组我也设置相对路径单击小图标吹动文件检查器中的位置下拉列表.我一直在寻找一个解决方案一段时间,并欣赏,如果有人可以帮助我回答上述问题.谢谢!

  5. ios – ffmpeg不会在我的项目中构建,在示例应用程序中运行良好

    我已经尝试了几个小时,但我无法弄清楚这一点.我在我的项目中使用KXMOVIE.我按照指示下载并编译了ffmpeg二进制文件.示例应用程序实际上工作正常,但我不能让它在我自己的项目中构建.所有.a文件都在那里,它与示例应用程序中的文件完全相同.当我尝试为模拟器构建时,我收到此错误.我究竟做错了什么?我甚至不知道从哪里开始.解决方法您还需要与libiconv链接.假设你拥有它,请将-liconv作为链接选项.

  6. ios – 从embedded.mobileprovision配置文件获取证书到期日期

    谁可以帮我进一步?

  7. xcode – xcrun因zip I / O错误而失败:没有这样的文件或目录zip错误:

    尝试使用xcrun导出存档失败,出现以下错误:解决方法xcrun需要绝对路径.(即/User/you/…

  8. ios – 如何将YUVJ420P中的FFMPEG AVFrame转换为AVFoundation cVPixelBufferRef?

    我在YUVJ420P中有一个FFMPEGAVFrame,我想用CVPixelBufferCreateWithBytes将它转换为CVPixelBufferRef.我想这样做的原因是使用AVFoundation来显示/编码帧.我选择了kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange并尝试转换它,因为AVFrame有三个平面的数据Y480Cb240Cr24

  9. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  10. Swift_UIImagePickerController选择图片显示

    Swift_UIImagePickerController选择图片显示代码如下:

随机推荐

  1. PHP个人网站架设连环讲(一)

    先下一个OmnihttpdProffesinalV2.06,装上就有PHP4beta3可以用了。PHP4给我们带来一个简单的方法,就是使用SESSION(会话)级变量。但是如果不是PHP4又该怎么办?我们可以假设某人在15分钟以内对你的网页的请求都不属于一个新的人次,这样你可以做个计数的过程存在INC里,在每一个页面引用,访客第一次进入时将访问时间送到cookie里。以后每个页面被访问时都检查cookie上次访问时间值。

  2. PHP函数学习之PHP函数点评

    PHP函数使用说明,应用举例,精简点评,希望对您学习php有所帮助

  3. ecshop2.7.3 在php5.4下的各种错误问题处理

    将方法内的函数,分拆为2个部分。这个和gd库没有一点关系,是ecshop程序的问题。会出现这种问题,不外乎就是当前会员的session或者程序对cookie的处理存在漏洞。进过本地测试,includes\modules\integrates\ecshop.php这个整合自身会员的类中没有重写integrate.php中的check_cookie()方法导致,验证cookie时返回的username为空,丢失了登录状态,在ecshop.php中重写了此方法就可以了。把他加到ecshop.php的最后面去就可

  4. NT IIS下用ODBC连接数据库

    $connection=intodbc_connect建立数据库连接,$query_string="查询记录的条件"如:$query_string="select*fromtable"用$cur=intodbc_exec检索数据库,将记录集放入$cur变量中。再用while{$var1=odbc_result;$var2=odbc_result;...}读取odbc_exec()返回的数据集$cur。最后是odbc_close关闭数据库的连接。odbc_result()函数是取当前记录的指定字段值。

  5. PHP使用JpGraph绘制折线图操作示例【附源码下载】

    这篇文章主要介绍了PHP使用JpGraph绘制折线图操作,结合实例形式分析了php使用JpGraph的相关操作技巧与注意事项,并附带源码供读者下载参考,需要的朋友可以参考下

  6. zen_cart实现支付前生成订单的方法

    这篇文章主要介绍了zen_cart实现支付前生成订单的方法,结合实例形式详细分析了zen_cart支付前生成订单的具体步骤与相关实现技巧,需要的朋友可以参考下

  7. Thinkphp5框架实现获取数据库数据到视图的方法

    这篇文章主要介绍了Thinkphp5框架实现获取数据库数据到视图的方法,涉及thinkPHP5数据库配置、读取、模型操作及视图调用相关操作技巧,需要的朋友可以参考下

  8. PHP+jquery+CSS制作头像登录窗(仿QQ登陆)

    本篇文章介绍了PHP结合jQ和CSS制作头像登录窗(仿QQ登陆),实现了类似QQ的登陆界面,很有参考价值,有需要的朋友可以了解一下。

  9. 基于win2003虚拟机中apache服务器的访问

    下面小编就为大家带来一篇基于win2003虚拟机中apache服务器的访问。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. Yii2中组件的注册与创建方法

    这篇文章主要介绍了Yii2之组件的注册与创建的实现方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下

返回
顶部