热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PHP使用ffmpeg压缩视频

PHP使用ffmpeg压缩视频视频压缩可以有一下方式:1.压缩分辨率例如视频的分辨率是720x1280,可以压缩分辨率为360x6402.压缩帧

PHP使用ffmpeg压缩视频

视频压缩可以有一下方式:

1.压缩分辨率

例如视频的分辨率是720x1280,可以压缩分辨率为360x640

2.压缩帧数

通过压缩视频的帧数来压缩,可以压缩视频的帧数到1秒10帧甚至1秒5帧

3.压缩比特率

即压缩视频的码率,要求不高的话可以压缩到700kb/s左右

4.压缩音频码率

压缩视频的音频码率,一般可以压缩到128kb/s或者64kb/s

5.修改视频编码方式

现在普遍是H.264编码,已经是最优编码

 

ffmpeg命令

1.查看视频信息

ffmpeg -i video.mp4

bitrate:1724kb/s就是比特率,128kb/s就是音频的码率,720x1280就是分辨率

2.压缩

我这边压缩视频的做法是只压缩比特率和分辨率,这样对视频的影响最小

ffmpeg -i video.mp4 -s 360x640 -b:v 862k new.mp4

其中-s 360x640表示修改分辨率为360x640

其中-b:v 862k表示修改比特率为862kb/s

其中video.mp4为原视频

其中new.mp4为压缩后的视频地址

 

其他压缩命令:

1.压缩帧数

ffmpeg -i video.mp4 -r 5 new.mp4

其中-r 5表示1秒5帧

2.压缩音频码率

ffmpeg -i video.mp4 -b:a 64k new.mp4

其中-b:a 64k表示音频码率为64k/s

3.修改编码方式

ffmpeg -i video.mp4 -vcodec libx264 new.mp4

其中-vcodec libx264表示H.264编码

 

上面的命令都是可以组合使用的,找到符合需求的命令组合压缩视频即可。

 

PHP代码实现获取视频信息以及压缩(压缩的组合命令是分辨率和比特率):

/* 视频压缩 */
public function compressVideo($file, $file_name) {$file_content &#61; file_get_contents($file);$compress_path &#61; PUBLIC_PATH;$compress_file &#61; $compress_path . $file_name . &#39;.mp4&#39;;$compress_after_file &#61; $compress_path . $file_name . &#39;_compress.mp4&#39;;try{file_put_contents($compress_file, $file_content);$video_info;exec(FFMPEG_PATH . "ffmpeg -i {$compress_file} 2>&1", $video_info);$video_info &#61; implode(&#39; &#39;, $video_info);$bitrate &#61; &#39;&#39;; // 比特率$resolution &#61; &#39;&#39;; // 分辨率if(preg_match("/Duration: (.*?), start: (.*?), bitrate: (\d*) kb\/s/", $video_info, $match)) {$bitrate &#61; $match[3];}if(preg_match("/Video: (.*?), (.*?), (.*?)[,\s]/", $video_info, $match)) {$resolution &#61; $match[3];}$file_size &#61; filesize($compress_file);$file_size &#61; intval($file_size / 1048576);if(empty($bitrate)) throwErr(&#39;找不到比特率信息&#39;);if(empty($resolution)) throwErr(&#39;找不到分辨率信息&#39;);if($file_size <10) throwErr(&#39;视频大小不足10M&#xff0c;不需要压缩&#39;, null, 1100);$resolution &#61; explode(&#39;x&#39;, $resolution);$bitrate_update &#61; &#39;&#39;;$resolution_width_update &#61; &#39;&#39;;$resolution_height_update &#61; &#39;&#39;;$bitrate_update &#61; $this->getVideoCompressBitrate($bitrate);$resolution_percent &#61; 0;if($resolution[0] > $resolution[1]) {if($resolution[1] > 320) {$resolution_percent &#61; $resolution[1] <&#61; 520 ? 0.8 : 0.5;}}else {if($resolution[0] > 320) {$resolution_percent &#61; $resolution[0] <&#61; 520 ? 0.8 : 0.5;}}if($resolution_percent > 0) {$resolution_width_update &#61; intval($resolution[0] * $resolution_percent);$resolution_height_update &#61; intval($resolution[1] * $resolution_percent);}if(empty($bitrate_update) && empty($resolution_width_update)) throwErr(&#39;比特率和分辨率同时不满足压缩条件&#39;, null, 1100);$compress_bitrate &#61; &#39;&#39;;$compress_resolution &#61; &#39;&#39;;if(!empty($bitrate_update)) {$compress_bitrate &#61; "-b:v {$bitrate_update}k";}if(!empty($resolution_width_update)) {$compress_resolution &#61; "-s {$resolution_width_update}x{$resolution_height_update}";}$compress_exec &#61; FFMPEG_PATH . "ffmpeg -i {$compress_file} %s% %v% {$compress_after_file}";$compress_exec &#61; str_replace(array(&#39;%s%&#39;, &#39;%v%&#39;), array($compress_resolution, $compress_bitrate), $compress_exec);exec($compress_exec);unlink($compress_file);return array(&#39;compress_file&#39; &#61;> $compress_after_file);}catch(\Exception $e) {unlink($compress_file);return array();}
}/* 获取视频压缩比特率 */
public function getVideoCompressBitrate($bitrate, $query_count &#61; 0) {$bitrate_update &#61; &#39;&#39;;if($bitrate >&#61; 700) {if($bitrate <&#61; 1000) {$bitrate_update &#61; intval($bitrate * 0.8);}else {$bitrate_update &#61; intval($bitrate * 0.5);}}if(empty($bitrate_update)) {return $query_count &#61;&#61; 0 ? $bitrate_update : $bitrate;}else {return $this->getVideoCompressBitrate($bitrate_update, &#43;&#43;$query_count);}
}

这里提供PHP获取视频的所有信息代码&#xff1a;

$info &#61; &#39;&#39;;
exec(FFMPEG_PATH . "ffmpeg -i {$compress_file} 2>&1", $info);$data &#61; array();
if (preg_match("/Duration: (.*?), start: (.*?), bitrate: (\d*) kb\/s/", $info, $match)) {$data[&#39;duration&#39;] &#61; $match[1]; //播放时间$arr_duration &#61; explode(&#39;:&#39;, $match[1]);$data[&#39;seconds&#39;] &#61; $arr_duration[0] * 3600 &#43; $arr_duration[1] * 60 &#43; $arr_duration[2]; //转换播放时间为秒数$data[&#39;start&#39;] &#61; $match[2]; //开始时间$data[&#39;bitrate&#39;] &#61; $match[3]; //码率(kb)
}
if (preg_match("/Video: (.*?), (.*?), (.*?)[,\s]/", $info, $match)) {$data[&#39;vcodec&#39;] &#61; $match[1]; //视频编码格式$data[&#39;vformat&#39;] &#61; $match[2]; //视频格式$data[&#39;resolution&#39;] &#61; $match[3]; //视频分辨率$arr_resolution &#61; explode(&#39;x&#39;, $match[3]);$data[&#39;width&#39;] &#61; $arr_resolution[0];$data[&#39;height&#39;] &#61; $arr_resolution[1];
}
if (preg_match("/Audio: (\w*), (\d*) Hz/", $info, $match)) {$data[&#39;acodec&#39;] &#61; $match[1]; //音频编码$data[&#39;asamplerate&#39;] &#61; $match[2]; //音频采样频率
}
if (isset($data[&#39;seconds&#39;]) && isset($data[&#39;start&#39;])) {$data[&#39;play_time&#39;] &#61; $data[&#39;seconds&#39;] &#43; $data[&#39;start&#39;]; //实际播放时间
}
return $data;

 


推荐阅读
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • javascript分页类支持页码格式
    前端时间因为项目需要,要对一个产品下所有的附属图片进行分页显示,没考虑ajax一张张请求,所以干脆一次性全部把图片out,然 ... [详细]
  • 检查在所有可能的“?”替换中,给定的二进制字符串中是否出现子字符串“10”带 1 或 0 ... [详细]
  • 如何使用 `org.eclipse.rdf4j.query.impl.MapBindingSet.getValue()` 方法及其代码示例详解 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • 在Android平台中,播放音频的采样率通常固定为44.1kHz,而录音的采样率则固定为8kHz。为了确保音频设备的正常工作,底层驱动必须预先设定这些固定的采样率。当上层应用提供的采样率与这些预设值不匹配时,需要通过重采样(resample)技术来调整采样率,以保证音频数据的正确处理和传输。本文将详细探讨FFMpeg在音频处理中的基础理论及重采样技术的应用。 ... [详细]
  • 本文介绍了一种使用 JavaScript 计算两个日期之间时间差的方法。该方法支持多种时间格式,并能返回秒、分钟、小时和天数等不同精度的时间差。 ... [详细]
  • 本文回顾了作者初次接触Unicode编码时的经历,并详细探讨了ASCII、ANSI、GB2312、UNICODE以及UTF-8和UTF-16编码的区别和应用场景。通过实例分析,帮助读者更好地理解和使用这些编码。 ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • MySQL Decimal 类型的最大值解析及其在数据处理中的应用艺术
    在关系型数据库中,表的设计与SQL语句的编写对性能的影响至关重要,甚至可占到90%以上。本文将重点探讨MySQL中Decimal类型的最大值及其在数据处理中的应用技巧,通过实例分析和优化建议,帮助读者深入理解并掌握这一重要知识点。 ... [详细]
  • 在本文中,我们将详细介绍如何构建一个用于自动回复消息的XML类。当微信服务器接收到用户消息时,该类将生成相应的自动回复消息。以下是具体的代码实现:```phpclass We_Xml { // 代码内容}```通过这个类,开发者可以轻松地处理各种消息类型,并实现高效的自动回复功能。我们将深入探讨类的各个方法和属性,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 卓盟科技:动态资源加载技术的兼容性优化与升级 | Android 开发者案例分享
    随着游戏内容日益复杂,资源加载过程已不仅仅是简单的进度显示,而是连接玩家与开发者的桥梁。玩家对快速加载的需求越来越高,这意味着开发者需要不断优化和提升动态资源加载技术的兼容性和性能。卓盟科技通过一系列的技术创新,不仅提高了加载速度,还确保了不同设备和系统的兼容性,为用户提供更加流畅的游戏体验。 ... [详细]
  • 在 Linux 环境下,多线程编程是实现高效并发处理的重要技术。本文通过具体的实战案例,详细分析了多线程编程的关键技术和常见问题。文章首先介绍了多线程的基本概念和创建方法,然后通过实例代码展示了如何使用 pthreads 库进行线程同步和通信。此外,还探讨了多线程程序中的性能优化技巧和调试方法,为开发者提供了宝贵的实践经验。 ... [详细]
  • 本文总结了JavaScript的核心知识点和实用技巧,涵盖了变量声明、DOM操作、事件处理等重要方面。例如,通过`event.srcElement`获取触发事件的元素,并使用`alert`显示其HTML结构;利用`innerText`和`innerHTML`属性分别设置和获取文本内容及HTML内容。此外,还介绍了如何在表单中动态生成和操作``元素,以便更好地处理用户输入。这些技巧对于提升前端开发效率和代码质量具有重要意义。 ... [详细]
author-avatar
风信子的春天R
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有