windows下通过nodejs将音频和图片进行批量合并

windows下通过nodejs将音频和图片进行批量合并

月光魔力鸭

2018-09-12 10:24 阅读 2134 喜欢 2 图片音频 合并

背景

客户有一批音频需要处理成视频,最好是带有图片,于是就有了下文。

原始目录结构

-- mp3
----01
------01.mp3
------01.jpg
----02
------02.mp3
------02.jpg

将目录全部处理成为同名,实现只是一个很简单的nodejs调用批处理操作,只是不用手动了。

ffmpeg 原始命令

ffmpeg -r 15 -f image2 -loop 1 -i d:/zzs/pp/2/index.jpg -i d:/zzs/pp/2/index.mp3 -s 720x480 -pix_fmt yuvj420p -t 567 -vcodec libx264 -y d:/zzs/pp/2/index.mp4

-loop 1 每帧循环
-s 分辨率
-t 输出视频时长

以上命令应该是能处理大部分的音频、图片吧 ,没有兼容测试,不过肯定会有其他问题,再进行微调就行。

代码

//将mp3 转化为mp4 文件

var ffmpeg = "d:/soft/ffmpeg/bin/";//ffmpeg path
var fs = require('fs');
var async = require('async');
var path = require('path');

//将目标下的文件夹获得,然后把里面的mp3 和 mp4 整合

function TOMP4( opts ){

	this.opts = opts;
	var arr = this.getFolder();
	this.start(arr);
	
}

//获得文件夹
TOMP4.prototype.getFolder  = function(){
	var thiz = this,opts = thiz.opts,target = opts.target;
	var arr = fs.readdirSync(target);
	return arr;
}
//获得mp3的时长,用于输出
TOMP4.prototype.getDuration = function( path,cb ){
	var exec = require('child_process').exec;
	exec(ffmpeg+'ffmpeg -i '+path,function(error,stdout,stderr){
		var std = error.toString();
		var bb = std.match(/Duration: ([0-9:.]*),/);
		var time = bb[1];
		console.log(time);
		var timeArr = time.split(':');
		var seconds = 0;
		timeArr.forEach(function( a, index ){
			a = Math.round(a);
			seconds += a * (index == 0 ? 3600 : (index == 1 ? 60 : 1));
		});
		cb(seconds);
	});
}
//调用命令转码
TOMP4.prototype.tomp4 = function(picpath,mp3path,topath,duration,cb){
	var exec = require('child_process').exec;
	console.log(mp3path+': 正在转化中,请等待....');
	exec(ffmpeg+'ffmpeg -r 15 -f image2 -loop 1 -i '+picpath+' -i '+mp3path+' -s 720x480 -pix_fmt yuvj420p -t '+duration+' -vcodec libx264 -y '+topath,function(err,stdout,stderr){
		console.log(mp3path+' 转化完成');
		cb(null,null);
	});
}
//启动入口
TOMP4.prototype.start = function( arr ){
	var thiz = this,opts = thiz.opts,target = opts.target,mp3 = opts.mp3,pic = opts.pic;
	async.mapLimit(arr,1,function(item,cb){
		thiz.transform(item,cb);
	},function(){
		console.log('全部转化完毕')
	});
}
//转化-函数
TOMP4.prototype.transform = function( item , cb ){
	var thiz = this,opts = thiz.opts,target = opts.target,mp3 = opts.mp3,pic = opts.pic,to = opts.to;
	var mp3Path = path.join(target,item,mp3);
	var picPath = path.join(target,item,pic);
	var toPath = path.join(target,item,to);
	thiz.getDuration(mp3Path,function(duration){
		thiz.tomp4(picPath,mp3Path,toPath,duration,cb);
	});
}

//调用
var aa = new TOMP4(
	{
		target : 'd:/zzs/pp/',
		mp3 : 'index.mp3',
		pic : 'index.jpg',
		to : 'index.mp4'
	}
);

代码逻辑

截图

处理结果.png

说明

代码比较粗糙,因为是临时性的工作,没有做很多的处理,只是勉强能用。

转载请注明出处: https://chrunlee.cn/article/nodejs-combo-picture-and-radio.html


感谢支持!

赞赏支持
提交评论
评论信息 (请文明评论)
暂无评论,快来快来写想法...
推荐
从豆瓣转到网易云后,发现了不少好听的歌曲,然鹅..当我想把这些歌拿下来扔车上听的时候发现竟然不允许下载..能听不能下?这不科学,作为一名程序猿,必然要迎难而上啊.
介绍几个日常开发中常用的几个小工具: anywhere / anywhere-auth / watchlessc / changeext
最近又回归了下DNF ,玩了一段时间,感觉也挺没意思的,关键是平时更没意思,想着不行搞个自动刷图吧(先说结论,没成)
通过pm2来实现nodejs应用的集群,不过我之前没做session共享,导致.. 登录不上啊 啊啊啊,无奈,又重新对redis进行了集成。
在开发项目过程中,经常需要将开发的项目部署到服务器上,但是每个环境都有每个环境的配置等等,如果每次打包的时候都要去调整(可能删除、替换等),那就很烦人了,这里分享下自己实现的几个简单的小工具(当然这个工具可能只对我自己有用),希望能够帮到你。
最近有接触到针对二维码进行识别的功能,然后对图片进行位置纠正、二维码扫描,并将数据进行整理。以下是通过nodejs做的,相对简单一些,没有太过严格,识别率也不是很高大约80%左右
由于只是做个测试,这里使用了expresss简单搭建了个后台服务,提供文件断点下载。
最近在折腾的时候又想写less了,但是换框架了,成了thinkjs,考虑到开发阶段一直编译编译less的情况..最终根据middleware的特点实现了一个超级简单的less中间件。