【NodeJs】使用ffmpeg将视频webm转换为mp4

news2024/12/23 1:59:28

使用Chrome浏览器录制视频文件是webm格式,但是很多媒体播放器是不支持的,不利于分享,需要转换为mp4格式才行,接下来给大家讲

ffmpeg

ffmpeg是什么呢,

  • 一个免费开源的视频转换工具,
  • 一款音视频编解码工具,
  • 一组音视频编解码开发套件,

可点此ffmpeg官方网站前往下载,按照自己的操作系统选择下载,

  • 这里给一个下载点🔗传送门

如下载的是一个压缩包ffmpeg-6.0-essentials_build.zip文件,解压后,打开btn文件夹,如下图
在这里插入图片描述

主要是ffmpeg.exe文件

CMD

在对应的文件夹下,鼠标右键选择打开CMD终端,然后执行以下命令

.\ffmpeg -version

输出版本信息,如下表示正常
在这里插入图片描述

转换视频

接下来,开始转换视频,

例如,把文件名为111.webm转换为111.mp4,就输入以下命令执行,

.\ffmpeg -i 111.webm 111.mp4

输出如下,看到在持续打印中,需要等待,打印到最后就算处理完成
在这里插入图片描述

处理完成,就查看文件夹有多了一个111.mp4文件,打开看看是否播放正常

更多ffmpeg命令,可参考这里的文章 使用ffmpeg将webm转换为mp4

遇到错误

如果输出错误,情况可能如下

[libx264 @ 00000212a6ea0700] height not divisible by 2 (1080x951)
[vost#0:0/libx264 @ 000001cb76fa1000] Error initializing output stream: Error while opening encoder for output stream #0:0 - maybe incorrect parameters such as bit_rate, rate, width or height
Conversion failed!

问题参考来源:FFMPEG (libx264) “height not divisible by 2”

导致错误原因是,原视频尺寸(分辨率)必须是偶数,否则会出错,

估计是,用于裁剪缩放尺寸,精度不容有差错,是比较严格,

这样做,中间加上配置参数pad,命令如下,自动纠正分辨率,即可解决

.\ffmpeg -i 111.webm -vf "pad=ceil(iw/2)*2:ceil(ih/2)*2" 111.mp4

还可以,加上配置参数scale=2:720,试试按比例改分辨率

Node

电脑有安装Node才能用,

如果不想一直手动输入,处理业务比较多的话,试试写个Node应用方式执行,可以批处理转换,

例如,实现一键自动处理,写一个文件webm_to_mp4.js,关键代码如下

//导入一些模块...
const cp = require('child_process');
//调用的exe文件名...
const ExeName = 'ffmpeg.exe';
const Label = '转换耗时';
//执行exe
function execCommand(source,target,callback){
    let args = [
        '-i', source, '-vf',
        '"pad=ceil(iw/2)*2:ceil(ih/2)*2"', target
    ];
    let command = `.${PATH_DIV}lib${PATH_DIV+ExeName} ${args.join(' ')}`;
    cp.exec(command,callback)
}

//在终端输入
rl.createInterface({
    input:process.stdin,
    output:process.stdout
}).question('输入(粘贴)要处理的webm视频文件地址',(answer)=>{
    if(answer.length<1) return;
    
    console.time(Label);
    let index = answer.lastIndexOf(PATH_DIV);
    if (index<1) throw new Error('input error'+answer);
    let path = answer.substring(0,index);
    let source = answer;
    let target = path+PATH_DIV+answer.substring(index+1).replace(/\.webm$/,'.mp4');
    //检查文件是否存在
    checkFileExists(source);
    checkFileExists(target,true);
    console.log('请等待...');
    execCommand(source, target,(error,stdout,stderr)=>{
        if (error) {
            console.log('遇到错误!',{ error, stdout, stderr });
        }else {
            console.log('生成成功!',{ stdout, stderr });
        }
        console.timeEnd(Label);
    })
});
console.log('正在执行...')

转换视频

打开CMD终端,执行node命令如下,运行正确会提示只粘贴一个要转换的视频文件地址即可,等待处理完成

node webm_to_mp4

到此结束,觉得文章有帮助,记得点个赞哦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/404175.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

日志与可视化方案:从ELK到EFK,再到ClickHouse

EFK方案 从ELK谈起 ELK是三个开源软件的缩写&#xff0c;分别表示&#xff1a;Elasticsearch&#xff0c;Logstash&#xff0c;Kibana。新增了一个FlieBeat&#xff0c;它是一个轻量级的日志收集处理工具&#xff0c;FlieBeat占用资源少&#xff0c;适用于在各个服务器上搜集…

JS语法(扫盲)

文章目录一、初识JavaScript二、第一个JS程序JS代码的引入JS程序的输出三、语法变量使用动态类型内置类型运算符强类型语言&弱类型语言条件语句循环语句数组创建数组获取数组元素新增数组元素删除数组元素函数语法格式形参实参个数的问题匿名函数&函数表达式作用域作用…

PHP 的运行方式有哪些?

PHP本质上的运行方式可以分为两种&#xff1a; 基于命令行的基于PHP-FPM的 但实际上&#xff0c;PHP能做的事很多&#xff0c;很多场景下&#xff0c;不同的运行方式能让开发更方便&#xff0c;减轻各种工作。 测试开发 PHP内置了一个HTTP 的server。这意味着&#xff0c;很…

stm32外设-GPIO

0. 写在最前 本栏目笔记都是基于stm32F10x 1. GPIO基本介绍 GPIO—general purpose intput output 是通用输入输出端口的简称&#xff0c;简单来说就是软件可控制的引脚&#xff0c; STM32芯片的GPIO引脚与外部设备连接起来&#xff0c;从而实现与外部通讯、控制以及数据采集的…

java Date 和 Calendar类 万字详解(通俗易懂)

Date类介绍及使用关于SimpleDateFormat类Calendar类介绍及使用LocalDateTime类介绍及使用关于DateTimeFormatter类一、前言本节内容是我们《API-常用类》专题的第五小节了。本节内容主要讲Date 类 和 Calendar 类&#xff0c;内容包括但不限于Date类简介&#xff0c;Date类使用…

【微信小程序】-- 自定义组件 - 数据监听器 (三十四)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &…

传奇开服流程—传奇单机架设教程

现在传奇私服还是那么的火爆&#xff0c;上次有报道发布站一年盈利几个亿&#xff0c;还是有很大的机会&#xff0c;很多玩家因为GM开服关服给折腾&#xff0c;刚充的钱服务器就关了&#xff0c;很是恼火&#xff0c;于是都想自己整个服开开&#xff0c;但又不知道从何下手&…

三菱FX5U之数据处理类指令的使用

本课程使用三菱PLC works3编程软件进行教学&#xff0c;并使用works3的仿真功能进行PLC仿真&#xff0c;学习的时候不需要有实物PLC。 补充说明&#xff1a;三菱 FX 5U系列PLC使用的是GX works3编程软件&#xff0c;FX 3U、Q系列PLC使用的是GX works3编程软件。 第一章 八个案…

YUV实践记录

文章目录YUV基础介绍&#xff1a;不同采样YUV格式的区别为什么要使用YUV格式呢&#xff1f;YUV的存储方式Android中的YUV_420_888附录&#xff1a;YUV基础介绍&#xff1a; YUV在做手机图像或者视频处理的时候会经常用到的一个格式&#xff0c;用此文来记录YUV相关介绍&#xf…

hibernate学习(五)

hibernate学习&#xff08;五&#xff09; hibernate的一对多关联映射&#xff1a; 一、数据库表与表之间关系 一对多建表原则&#xff1a; 多对多的建表原则&#xff1a; 一对一建表原则&#xff1a; &#xff08;1&#xff09;唯一外键对应&#xff1a; &#xff08;…

时间复杂度和空间复杂度的计算

目录 算法的复杂度 时间复杂的的概念 时间复杂度计算方法 大O的渐进表示法 空间复杂的概念 空间复杂的的计算方法 时间和空间复杂度的应用 消失的数字 轮转数组 算法的复杂度 算法在编写成可执行程序后&#xff0c;运行时需要耗费时间资源和空间&#xff08;内存&…

modbus转profinet网关连接5台台达ME300变频器案例

通过兴达易控Modbus转Profinet&#xff08;XD-MDPN100&#xff09;网关改善网络场景&#xff0c;变频器有掉线或数据丢失报警&#xff0c;影响系统的正常运行&#xff0c;将5台 ME300变频器modbus转Profinet到1200PLC&#xff0c;通过网关还可以实现Profinet转modbus RTU协议转…

LabVIEW中以编程方式获取VI克隆名称

LabVIEW中以编程方式获取VI克隆名称演示如何以编程方式获取VI的名称或克隆名称。如果VI作为顶级VI运行&#xff0c;则将显示VI的名称。如果VI在主VI中用作子VI&#xff0c;它将返回克隆的名称。在项目开发过程中&#xff0c;有时需要获取VI的名称。在此示例中&#xff0c;实现了…

【数论】试除法判断质数,分解质因数,筛质数

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法......感兴趣就关注我吧&#xff01;你定不会失望。 &#x1f308;个人主页&#xff1a;主页链接 &#x1f308;算法专栏&#xff1a;专栏链接 现已更新完KMP算法、排序模板&#xff0c;之…

代码管理--svnadmin工具介绍

1、简介 SVNAdmin2 是一款通过图形界面管理服务端SVN的web程序。正常情况下配置SVN仓库的人员权限需要登录到服务器手动修改 authz 和 passwd 两个文件&#xff0c;当仓库结构和人员权限上了规模后&#xff0c;手动管理就变的非常容易出错&#xff0c;本系统能够识别人员和权限…

【AWS入门】IAM基本应用-2023/3/4

目录IAM概述根用户和IAM用户参考IAM概述 IAM(Identity Access Management&#xff09;是身份和访问管理服务&#xff0c;要访问AWS服务和资源&#xff0c;就要使用IAM进行身份验证和授权。当我们通过控制台&#xff0c;CLI&#xff0c;或API访问AWS服务时&#xff0c;都需要通…

p5.js map映射

theme: smartblue 本文正在参加「金石计划」 本文简介 带尬猴&#xff0c;我嗨德育处主任 p5.js 为开发者提供了很多有用的方法&#xff0c;这些方法实现起来可能不难&#xff0c;但却非常实用&#xff0c;能大大减少我们的开发时间。 本文将通过举例说明的方式来讲解 映射 map…

《计算机网络》期末复习笔记

文章目录一、一些英文名词的标签&#xff08;方便记忆&#xff09;二、OSI七层协议三、综合题3.0 知识点储备3.1 在Internet 网中&#xff0c;某计算机的IP 地址是11001010.01100000.00101100.01011000 &#xff0c;请回答下列问题3.2 假定发送方要发送的数据为10000101。采用C…

【Spring 深入学习】AOP的前世今生之后续

AOP的前世今生之后续 1. 概述 上篇文章【Spring 深入学习】AOP的前世今生之代理模式我们讲述了代理模式。而我们今天的主人公AOP就是基于代理模式实现的&#xff0c;所以我们今天会简单学习下AOP 2. 什么是AOP 是面向切面编程&#xff0c;一般可以帮助我们在不修改现有代码的情…

Java中字符流(FileReader(read、close)、FileWriter(write、close)、字符(输入、输出)流原理解析)

1.创建对象&#xff1a; 2.读取数据 3.释放资源&#xff08;关流&#xff09; 如何使用重载的read()方法呢&#xff1f; FileWriter&#xff1a; 在前面我们指导&#xff0c;字节输出流和字符输出流的本质区别是&#xff0c;字节输出流一次只能操作一个字节&#xff0c;如果让…