composer require php-ffmpeg/php-ffmpeg

注意:请在 php.ini 中开启这两个函数proc_open,proc_get_status。找到 disable_functions 将里面的这两个函数去掉就好了

ffmpeg下载

<?phpnamespace App\Helpers\Utils;use FFMpeg\FFMpeg;
use FFMpeg\Format\Video\X264;
use Illuminate\Support\Facades\Storage;class FFMpegUtil
{protected $ffmpeg;public function __construct(){$this->ffmpeg = FFMpeg::create(array('ffmpeg.binaries' => env('FFMPEG_PATH', '/usr/bin/ffmpeg'),'ffprobe.binaries' => env('FFPROBE_PATH', '/usr/bin/ffprobe'),'timeout' => 3600, // The timeout for the underlying process'ffmpeg.threads' => 12,   // The number of threads that FFMpegUtil should use));}public function create(){return FFMpeg::create(array('ffmpeg.binaries' => env('FFMPEG_PATH', '/opt/local/ffmpeg/bin/ffmpeg'),'ffprobe.binaries' => env('FFPROBE_PATH', '/opt/local/ffmpeg/bin/ffmpeg'),'timeout' => 3600, // The timeout for the underlying process'ffmpeg.threads' => 12,   // The number of threads that FFMpegUtil should use));}public function getVideoSeconds($video_url){$stream = $this->ffmpeg->getFFProbe()->streams($video_url)->videos()->first();return ceil($stream->get('duration'));}/*** video to audio* @param $video_url* @return array*/public function transformToAudio($video_url, $audioformat = 'mp3'){$video = $this->ffmpeg->open($video_url);$format = new X264('libmp3lame', 'libx264');$format->setKiloBitrate(1000)          // 视频码率->setAudioChannels(2)        // 音频声道->setAudioKiloBitrate(256); // 音频码率// 保存为$store = Storage::disk('temp');// $store->makeDirectory(date('Ymd'));$filename = uniqid().'.'.$audioformat;$dir = $store->path($filename);$video->save($format, $dir);$url = env('APP_URL').'/'.str_replace("\\", "/", $dir);return ['message' => 'succeed', 'path' => $dir, 'url' => $url];}
}

config/filesystems.php

        'temp' => ['driver' => 'local','root' => 'temp/'.date("Ymd"),'url' => env('APP_URL').'/temp/'.date("Ymd"),'visibility' => 'public',],
'disks' => [ 

// ...

],

添加上面的内容

调用

    public function extractAudio(Request $request) {/** @var $file \Illuminate\Http\UploadedFile */$file = $request->file('file');//判断文件是否上传成功if (!$file->isValid()) {return $this->failed(ErrorCode::PARAM_ERROR);}$videoPath = "./upload/".uniqid().'.tmp';move_uploaded_file($file->getRealPath(), $videoPath);$ffmpeg = new FFMpegUtil();$ans = $ffmpeg->transformToAudio($videoPath, "wav");unlink($videoPath);return $ans;}

返回

{

"message": "succeed",

"path": "temp/20220907\\63181056de07f.wav",

"url": "http://api-tts.021city.xyz/temp/20220907/63181056de07f.wav"

}

ffmpeg参数文档

视频去掉声音,换另一个声音

ffmpeg -i sampleVideo.mp4 -vcodec copy –an  audioless.mp4
ffmpeg -i audioless.mp4 -i ..\audio\huolala01.wav -c:v copy -c:a aac output.mp4
ffplay output.mp4

利用ffmpeg合并音频和视频

VideoService.php

<?phpnamespace App\Services;use FFMpeg\Coordinate\TimeCode;
use FFMpeg\FFMpeg;
use FFMpeg\FFProbe;
use FFMpeg\Format\Audio\Wav;
use FFMpeg\Format\Video\X264;
use FFMpeg\Media\Video;
use Illuminate\Support\Facades\Log;class VideoService
{/** @var FFMpeg */private $ffmpeg;const CHUNK_SECONDS = 60;  // 视频切分片段时长(s)/*** linux/mac上再安装 ffmpeg, ffprobe*/public function __construct() {$this->ffmpeg = FFMpeg::create(array('ffmpeg.binaries'  => base_path().'/bin/'.PHP_OS.'/ffmpeg.exe','ffprobe.binaries' => base_path().'/bin/'.PHP_OS.'/ffprobe.exe','timeout'          => 3600, // The timeout for the underlying process'ffmpeg.threads'   => 4,   // The number of threads that FFMpeg should use));}/*** 用ffmpeg从视频提取音频* @param string $videoPath* @param array $audioPathList* @return array*/public function extractVideo(string $videoPath, array &$audioPathList) {$today = date("Y-m-d");/** @var $dir string 创建临时工作目录 */$dir = public_path('temp').DIRECTORY_SEPARATOR.$today;if (!is_dir($dir)) {mkdir($dir, 0755, true);}// 取得视频时长$ffprobe = FFProbe::create();$duration = $ffprobe->format($videoPath)->get('duration');Log::debug("video duration=".$duration);/** @var $uriList array 音频相对路径 */$uriList = [];$startSeconds = 0;/** @var $video Video 切分视频 */$video = $this->ffmpeg->open($videoPath);$videoMd5 = md5_file($videoPath);$videoChunks = [];for ($leftSeconds = $duration, $i = 0; $leftSeconds > 0; $leftSeconds -= self::CHUNK_SECONDS, $i+=1) {if ($leftSeconds > self::CHUNK_SECONDS) {$endSeconds = $startSeconds + self::CHUNK_SECONDS;} else {$endSeconds = $duration; // 最后一段时长不足self::CHUNK_SECONDS}/** @var $clip \FFMpeg\Media\Clip 取一段试试 */$clip = $video->clip(TimeCode::fromSeconds($startSeconds), TimeCode::fromSeconds($endSeconds));$chunkPath = $dir.DIRECTORY_SEPARATOR.'video_'.$videoMd5.'_'.$i.'.avi';// 上一步超时文件已存在,继续上一步的if (!file_exists($chunkPath)) {$format = new X264();$clip->save($format, $chunkPath);// 记录执行的命令Log::info("ffmpeg ".json_encode($clip->getFinalCommand($format, $chunkPath)));}/** @var $video \FFMpeg\Media\AdvancedMedia */$advancedMedia = $this->ffmpeg->openAdvanced(array($chunkPath));$file = 'audio_'.$videoMd5.sprintf("%03d", $i).'.wav';$audioPath = $dir.DIRECTORY_SEPARATOR.$file;if (!file_exists($audioPath)) {$advancedMedia->map(array('0:a'), new Wav(), $audioPath)->save();Log::info("ffmpeg ".$advancedMedia->getFinalCommand());}$uri = "temp/".$today.'/'.$file;$audioPathList[] = $audioPath;$uriList[] = $uri;// 更新开始时刻$startSeconds = $endSeconds;// 准备删除临时文件$videoChunks[] = $chunkPath;}foreach ($videoChunks as $toDel) {unlink($toDel);}return array_map(function(string $uri) {return config("app.url").'/'.$uri;}, $uriList);}public function pcm2wav(string $pcmPath, string $wavPath) {$audio = $this->ffmpeg->open($pcmPath);return $audio->save(new Wav(), $wavPath);}
}

上海享有网络科技有限公司

13381504770

上海市嘉定区江桥万达广场8号写字楼301室

这里不开工资,去了白干。

ffmpeg 视频提取音频 php-ffmpeg相关推荐

  1. 视频提取音频 - 手机视频在线提取音频提取器

    怎样将视频中的音频提取出来?一刀工具箱提供一键可将手机相册中的视频提取音频,便捷的快速获取到视频中的音频文件,视频提取音频的软件,免费转换 mp3 格式的工具. 代码片段 buildVideo(){l ...

  2. 视频提取音频怎么弄?快把这些方法收好

    在闲暇的时候,我们通常都会看一些视频来放松自己,那小伙伴们有遇到过,看到一个视频,觉得里面的音乐很不错,想要将它保存下来,可是怎么也搜不到音频相关信息的情况吗?这种时候,其实我们可以将视频的音频提取出 ...

  3. 怎么视频提取音频文件?分享这3种简单实用的提取方法

    不知道大家平时用手机刷视频的时候,会不会被一些好听的背景音乐给吸引了呢?这些背景音乐大多都是网友们自己合成导入视频上传的,可能在许多音乐平台都不能找到音源播放.遇到这样的情况,大家一定都很苦恼吧?但其 ...

  4. ffmpeg 视频抽取音频,视音频分离

    抽取音频命令 ffmpeg -i 3.mp4 -vn -y -acodec copy 3.aac ffmpeg -i 3.mp4 -vn -y -acodec copy 3.m4a 提取视频 (Ext ...

  5. Android开发记录:视频提取音频

    文章目录 前言 使用方法 前言 Android开发中从视频中提取音频主要有三种方式结合FFmpeg,MP4Parser,MediaExtractor. 多媒体视频处理工具FFmpeg有非常强大的功能包 ...

  6. 纯js实现在线视频提取音频

    不用上传视频到后台,文件大小无限制,只需要在浏览器当中选择视频文件等待处理完成即可. 如果你想要从视频中提取音频,但又不知道该如何实现,那么你绝对不要错过我们的在线提取视频中音频文件工具!我们的工具是 ...

  7. 这几个视频提取音频的方法很实用,快来学习

    许多小伙伴都喜欢在空闲的时候刷刷小视频,有时候我们听到一些视频的背景音乐很好听,但是在网上却找不到相关音源,这时候我们可以将视频中的音频提取出来,这样就可以随时播放了.那如何把视频中的音频提取出来呢? ...

  8. 电脑上一键从视频提取音频,windows电脑和mac电脑都可以用

    一些网民在观看视频时喜欢保存自己喜欢的部分,但是朋友们,您知道如何分离视频中的音频吗? 今天,我将与您分享如何从视频中提取音频,以帮助需要帮助的人. 如何提取音频,大多数人我都不告诉他 工具/材料 计 ...

  9. php视频提取音频,怎么提取视频中音频文件?视频文件如何分离提取出音频文件?视频转换成音频的方法...

    快要过年啦,小编在这里提前祝大家新年快乐,万事如意,嘻嘻(#^.^#).今天就能回家啦,好激动٩(๑>◡ 首先呢,我们需要先通过上方的连接诶下载我们所要用到的软件,下载完成之后解压缩包,在打开的 ...

最新文章

  1. OSPF LSA 类型
  2. SQL 时间类型转字符串格式列表
  3. 文本编辑器_国外程序员最爱的5种文本编辑器
  4. linux下线程绑定内核,多线程 – 无法将内核线程绑定到CPU
  5. Restrictions查询用法
  6. Linux系统常用函数,浅谈linux下的一些常用函数的总结(必看篇)
  7. 《转》完美解决微信video视频隐藏控件和内联播放问题
  8. Python getattr() 函数
  9. 使用PL/SQL Developer给Oracle生成漂亮的数据库说明文档
  10. 构造函数和析构函数的作用,面向对象的三大特征
  11. 记一次Vue全页面SSR深坑之旅 - 微弱的内存/CPU泄漏
  12. 买入股票后必须遵守的八项原则
  13. 【前端】html页面的字体代码表及字体效果对比
  14. 精神小伙儿探秘JVM( 六)
  15. pandas爬虫爬取网页表格
  16. 锐捷ac怎么发现局域网ap_【无线】无线查看限速配置(AC和AP的命令一样)
  17. python中invalid argument_Python创建文件报错OSError:[Errno 22] Invalid argument处理
  18. Xilinx ZYNQ差分时钟
  19. 回顾我第一次接触编程
  20. 织梦CMS首页调用分类信息栏目及列表方法

热门文章

  1. 十个著名思维实验的思考
  2. 跨站脚本攻击-----为什么要过滤危险字符串
  3. 服装管理系统c语言(大一)
  4. 电子信息类和计算机类专业网课表
  5. 在 Surface 或 Windows 10 中启用和禁用触摸屏
  6. 透明图片怎么发给别人_苹果实况图片怎么发给别人
  7. vue使用脚手架的单文件组件环境搭建
  8. 如何用阿里云服务器建立个人网站(针对新手)
  9. Composite Coloring(思维 数论(筛素数 分解质因数))
  10. 腾讯云Linux云服务器如何搭建FTP服务?