当前位置:   article > 正文

PHP 使用FFMpeg压缩处理视频_php ffmpeg

php ffmpeg

FFMpeg压缩处理视频

  1. <?php
  2. $xd_file = '原视频地址路径和名';
  3. $file = dirname(dirname(dirname(__FILE__))) . '/' . $xd_file;
  4. $file_data = pathinfo($file);
  5. // PHP获取视频的所有信息
  6. $info = shell_exec("ffprobe -v quiet -print_format json -show_format -show_streams " . $file);
  7. //$info = shell_exec("ffmpeg -i " . $file . " 2>&1");echo'<pre>';var_dump($info);die;
  8. //# 获取视频时长、开始时间、码率:
  9. //if (preg_match("/Duration: (.*?), start: (.*?), bitrate: (\d*) kb\/s/", $info, $match)) {
  10. // $arr_duration = explode(':', $match[1]);
  11. // $data['seconds'] = $arr_duration[0] * 3600 + $arr_duration[1] * 60 + $arr_duration[2]; // 转换播放时间为秒数
  12. // $data['start'] = $match[2]; // 开始时间
  13. // $data['bitrate'] = $match[3]; // 码率(kb)
  14. //}
  15. //# 获取视频编码、格式、分辨率:
  16. //if (preg_match("/Video: (.*?), (.*?\(.*?\)), (.*?)[, ]/", $info, $match)) {
  17. // $data['vcodec'] = $match[1]; // 视频编码格式
  18. $data['vcodec'] = substr($match[1], 0, strrpos($match[1], " (")); // 视频编码格式
  19. // $data['vformat'] = $match[2]; // 视频格式
  20. // $data['resolution'] = $match[3]; // 视频分辨率
  21. // $arr_resolution = explode('x', $match[3]);
  22. // $data['width'] = $arr_resolution[0];
  23. // $data['height'] = $arr_resolution[1];
  24. //}
  25. //# 获取视频内音频编码、采样率:
  26. //if (preg_match("/Audio: (.*?), (\d*) Hz/", $info, $match)) {
  27. // $data['acodec'] = $match[1]; // 音频编码
  28. $data['acodec'] = substr($match[1], 0, strrpos($match[1], " (")); // 音频编码
  29. // $data['asamplerate'] = $match[2]; // 音频采样频率
  30. //}
  31. //# 实际播放时间:
  32. //if (isset($data['seconds']) && isset($data['start'])) {
  33. // $data['play_time'] = $data['seconds'] + $data['start']; // 实际播放时间
  34. //}
  35. //$data['size'] = filesize($file); // 文件大小
  36. //echo '<pre>';
  37. //var_dump($data);
  38. //die;
  39. $video_data = json_decode($info, true);
  40. $data['vcodec'] = $video_data['streams'][0]['codec_name']; // 视频编码格式
  41. $data['width'] = $video_data['streams'][0]['width']; // 视频宽度
  42. $data['height'] = $video_data['streams'][0]['height']; // 视频高度
  43. $data['bit_rate'] = $video_data['streams'][0]['bit_rate']; // 1400000
  44. $data['r_frame_rate'] = $video_data['streams'][0]['r_frame_rate']; // 30
  45. $data['acodec'] = $video_data['streams'][1]['codec_name']; // 音频编码格式
  46. $data['streams_v_tags'] = $video_data['streams'][0]['tags'];
  47. $data['streams_a_tags'] = $video_data['streams'][1]['tags'];
  48. $data['format_tags'] = $video_data['format']['tags'];
  49. $r_frame_rate = 0;
  50. if (strpos($data['r_frame_rate'], '/') !== false) {
  51. $r_frame_rate = explode("/", $data['r_frame_rate'])[0] / explode("/", $data['r_frame_rate'])[1];
  52. } else {
  53. $r_frame_rate = $data['r_frame_rate'];
  54. }
  55. if ($data['bit_rate'] > 1400000) {
  56. $new_file_name = '新视频地址路径和名';
  57. // 有视频旋转属性 对调分辨率
  58. if (isset($data['streams_v_tags']['totate']) && !empty($data['streams_v_tags']['totate'])) {
  59. $aaa = $data['width'];
  60. $data['width'] = $data['height'];
  61. $data['height'] = $aaa;
  62. }
  63. // 设置视频元数据
  64. $metadata = '';
  65. foreach ($data['format_tags'] as $k1 => $v1) {
  66. if ($k1 != 'major_brand' && $k1 != 'minor_version' && $k1 != 'compatible_brands') {
  67. $metadata .= " -metadata " . $k1 . "=''";
  68. }
  69. }
  70. $v_metadata = '';
  71. foreach ($data['streams_v_tags'] as $k2 => $v2) {
  72. if ($k2 != 'handler_name') {
  73. $v_metadata .= " -metadata:s:v:0 " . $k2 . "=''";
  74. }
  75. }
  76. $a_metadata = '';
  77. foreach ($data['streams_a_tags'] as $k3 => $v3) {
  78. if ($k3 != 'handler_name') {
  79. $a_metadata .= " -metadata:s:a:0 " . $k3 . "=''";
  80. }
  81. }
  82. $exec = "ffmpeg -i " . $file;
  83. if (!empty($metadata)) {
  84. $exec .= $metadata;
  85. }
  86. if (!empty($v_metadata)) {
  87. $exec .= $v_metadata;
  88. }
  89. if (!empty($a_metadata)) {
  90. $exec .= $a_metadata;
  91. }
  92. // 帧率 > 30 改为30 帧率
  93. if ($r_frame_rate > 30) {
  94. $exec .= " -r 30";
  95. }
  96. // 宽 > 高 横屏
  97. if ($data['width'] > $data['height']) {
  98. if ($data['height'] > 720) {
  99. $exec .= " -s 1280x720 -b:v 1300k ";
  100. } else {
  101. $exec .= " -b:v 1300k ";
  102. }
  103. } else { // 高 > 宽 竖屏
  104. if ($data['width'] > 720) {
  105. $exec .= " -s 720x1280 -b:v 1300k ";
  106. } else {
  107. $exec .= " -b:v 1300k ";
  108. }
  109. }
  110. // 音频编码是 aac
  111. if ($data['acodec'] == 'aac') {
  112. $exec .= "-strict -2 ";
  113. }
  114. // 视频编码不是 h264
  115. if ($data['vcodec'] != 'h264') {
  116. $exec .= "-vcodec h264 ";
  117. }
  118. // 音频编码是 aac
  119. if ($data['acodec'] == 'aac') {
  120. $exec .= "-strict -2 ";
  121. }
  122. $exec .= $new_file_name;
  123. shell_exec($exec);
  124. // 删除原文件
  125. if (unlink(dirname(dirname(dirname(__FILE__))) . '/' . $xd_file)) {
  126. // 重命名新文件名为原文件名
  127. rename($new_file_name, $file_data['dirname'] . '/' . $file_data['filename'] . '.' . $file_data['extension']);
  128. }
  129. } else {
  130. return $xd_file;
  131. }

Linux 宝塔面板安装FFMpeg和编码库

  1. yum install https://download1.rpmfusion.org/free/el/rpmfusion-free-release-7.noarch.rpm
  2. yum install http://rpmfind.net/linux/epel/7/x86_64/Packages/s/SDL2-2.0.14-2.el7.x86_64.rpm
  3. yum install ffmpeg
  4. yum -y install ffmpeg-devel

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/515137
推荐阅读
相关标签
  

闽ICP备14008679号