媒体文件audio 转 base64 编码 (利用 FileReader & Audio 对象)

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script type="text/javascript" src="http://code.jquery.com/jquery-1.11.1.min.js"></script>
		<script type="text/javascript">
			(function(){
				//颜色动画插件  收录 前端网 halcheung 大侠的笔记。网址 http://www.w3cfuns.com/notes/17953/6ceda0bfa4a98d2d1a8c03fb638bae4e.html
				// store the jq animate function temporarily
	            var _anim = $.fn.animate;
	            // override jq animate function
	            $.fn.extend({
	                animate: function (styles, speed, easing, callback) {
	                    if (typeof styles == "object") {
	                        var colorStyles = null,
	                            that = this;
	                        for (var style in styles) {
	                            // init colorStyle object
	                            if (!colorStyles && /color/gi.exec(style)) colorStyles = {};
	                            // get the color styles
	                            if (style == "color") {
	                                colorStyles.color = styles[style];
	                            } else if (style == "background-color" || style == "backgroundColor") {
	                                colorStyles.backgroundColor = styles[style];
	                            } else if (style == "border-color" || style == "borderColor") {
	                                colorStyles.borderColor = styles[style];
	                            } else if (style == "border-top-color" || style == "borderTopColor") {
	                                colorStyles.borderTopColor = styles[style];
	                            } else if (style == "border-right-color" || style == "borderRightColor") {
	                                colorStyles.borderRightColor = styles[style];
	                            } else if (style == "border-bottom-color" || style == "borderBottomColor") {
	                                colorStyles.borderBottomColor = styles[style];
	                            } else if (style == "border-left-color" || style == "borderLeftColor") {
	                                colorStyles.borderLeftColor = styles[style];
	                            }
	                            delete styles[style];
	                        }
	                        // if check color styles positive
	                        if (colorStyles) {
	                            // color animation class
	                            function animColor() {
	                                // color animation function
	                                this.anim = function (colorStyle, targetStyleColor) {
	                                    targetStyleColor = formatColor(targetStyleColor);
	                                    var currentColor = formatColor($(that).get(0).style[colorStyle]),
	                                        step = calcStep(currentColor, targetStyleColor);
	                                    changeColor(colorStyle, currentColor, targetStyleColor, step);
	                                };
	                                // color value step of animation
	                                function calcStep(startColor, endColor) {
	                                    var maxDiff = -1, animStep = 1;
	                                    for (var i = 0; i < 3; i++) {
	                                        if (Math.abs(endColor[i] - startColor[i]) > maxDiff) {
	                                            maxDiff = Math.abs(endColor[i] - startColor[i]);
	                                        }
	                                    }
	                                    animStep = Math.floor(maxDiff / (speed / 20));
	                                    //console.log(maxDiff + "," + speed);
	                                    animStep = !animStep ? 1 : animStep;
	                                    return animStep;
	                                }
	                                // set the middle frame color of element
	                                function changeColor(colorStyle, middleStyle, toStyle, step) {
	                                    middleStyle = changeColorStep(middleStyle, toStyle, step);
	                                    $(that).get(0).style[colorStyle] = "rgb(" + middleStyle[0] + "," + middleStyle[1] + "," + middleStyle[2] + ")";
	                                    if (middleStyle[0] == toStyle[0] && middleStyle[1] == toStyle[1] && middleStyle[2] == toStyle[2]) {
	                                        $(that).get(0).style[colorStyle] = hexColor(middleStyle);
	                                        return;
	                                    }
	                                    setTimeout(function () {
	                                        changeColor(colorStyle, middleStyle, toStyle, step);
	                                    }, 20);
	                                }
	                                // calculate step color
	                                function changeColorStep(curClr, tgtClr, step) {
	                                    for (var i = 0; i < 3; i++) {
	                                        if (curClr[i] < tgtClr[i]) {
	                                            curClr[i] += step;
	                                            if (curClr[i] > tgtClr[i]) curClr[i] = tgtClr[i];
	                                        } else if (curClr[i] > tgtClr[i]) {
	                                            curClr[i] -= step;
	                                            if (curClr[i] < tgtClr[i]) curClr[i] = tgtClr[i];
	                                        }
	                                    }
	                                    return curClr;
	                                }
	                                // convert hex color to rgb color
	                                function formatColor(styleColor) {
	                                    if (!styleColor) {
	                                        return [0, 0, 0];
	                                    } else {
	                                        var r = g = b = 0;
	                                        if (/^#[a-f0-9]{3}$/gi.exec(styleColor)) {
	                                            r = parseInt(styleColor.substr(1, 1) + styleColor.substr(1, 1), 16);
	                                            g = parseInt(styleColor.substr(2, 1) + styleColor.substr(2, 1), 16);
	                                            b = parseInt(styleColor.substr(3, 1) + styleColor.substr(3, 1), 16);
	                                        } else if (/^#[a-f0-9]{6}$/gi.exec(styleColor)) {
	                                            r = parseInt(styleColor.substr(1, 2), 16);
	                                            g = parseInt(styleColor.substr(3, 2), 16);
	                                            b = parseInt(styleColor.substr(5, 2), 16);
	                                        } else if (styleColor.toLowerCase().indexOf("rgb") != -1) {    // rgb
	                                            styleColor = styleColor.toLowerCase().split(/\(|\)/gi)[1].split(',');
	                                            r = styleColor[0].trim() * 1;
	                                            g = styleColor[1].trim() * 1;
	                                            b = styleColor[2].trim() * 1;
	                                        }
	                                        return [r, g, b];
	                                    }
	                                }
	                                // convert rgb color to hex color
	                                function hexColor(rgb) {
	                                    var r = ("0" + rgb[0].toString(16)).substr(-2),
	                                        g = ("0" + rgb[1].toString(16)).substr(-2),
	                                        b = ("0" + rgb[2].toString(16)).substr(-2);
	                                    return "#" + r + g + b;
	                                }
	                            }
	
	                            // play color animation
	                            for (var styl in colorStyles) {
	                                var anim = new animColor();
	                                anim.anim(styl, colorStyles[styl]);
	                                anim = null;
	                            }
	                        }
	                    }
	
	                    // most important step: get the original function of jq animate
	                    return _anim.apply(this, [styles, speed, easing, callback]);
	                }
	            });
			})();
			(function(){
				$.fn.dragToDrop = function(fun){
					var eventStr = "dragleave drop dragenter dragover";
					$(document).on(eventStr,function(e){
				        e.preventDefault(); // 禁用 document 默认行为
				    });
				    $(this).on(eventStr,function(e){
				    	e.preventDefault();
				    	var files;
				    	if(e.type == "drop") files = e.originalEvent.dataTransfer.files; //获取文件对象 
				    	fun(files);
				    })
				    return this;
				}
				
			})();
			(function(){ //列队播放音频文件
				var music;
				var i = 0;
				var flag = false;
				var playlist = [];
				$.audio = function(data){
					playlist.push(data);
					//console.log(music)
					if(!music || $.type(music) != "object"){
						music = new Audio(data);
						music.play();
					}
					$(music).on("play",function(){
						flag = false;
					});
					$(music).on('ended',function(){
						if(flag) return;
						flag = true;
						i++;
						if(i >= playlist.length){
							music = null;
							return;
						}
						this.src = playlist[i];
						this.play();
						return;
					});
				}
			})();
			(function(){
				$.readFileData = function(obj, fun){ //读取文件内容
					var reader = new FileReader();//新建一个FileReader
					reader.readAsDataURL(obj, "UTF-8");//以base64编码方式读取文件
					reader.onload = function(e){
						fun(e.target.result);
					}
				}
				$.eachFiles = function(files){ // 遍历文件列表
					var obj = $("#look ul").length > 0 ? $("#look ul") : $("<ul>").appendTo($("#look"))
					var fileType = "mp3,ogg,wav,mid,midi,wma,asf";
					$.each(files, function(i,n){
						$.readFileData(n, function(data){
							obj.append($("<li>").css({"text-overflow":"ellipsis","white-space":"nowrap"}).text(n.name + " - " + data));
							if(fileType.indexOf(n.name.split(".")[1]) > -1) $.audio(data);
						});
					});
				}
				Number.prototype.toFormatString = function(n,d){
					return (Array(d).join(0) + this.toString(n)).slice(-d);
				}
				window.rgb = function (a,b,c){
					return "#" + a.toFormatString(16,2) + b.toFormatString(16,2) + c.toFormatString(16,2);
				}
				window.compileString = function(str){
				 	return new Function("return " + str)();
				}
				window.RBGToHex = function(str){
					return compileString(str);
				}
				window.HexToRGB = function(str){
					if(str.length == 4)	str = str.replace(/^#([A-Fa-f0-9]{1})([A-Fa-f0-9]{1})([A-Fa-f0-9]{1})/,"$1,$2,$3")
					if(str.length == 7)	str = str.replace(/^#([A-Fa-f0-9]{2})([A-Fa-f0-9]{2})([A-Fa-f0-9]{2})/,"$1,$2,$3")
					var arr = str.split(",");
					$.each(arr,function(i,n){
						if(n.length == 1){
							if(parseInt(n,16) > 0) n += n;
						}
						arr[i] = parseInt(n,16)
					});
					return "rgb(" + arr.join(",") + ")";
				}
			})();
			$(function(){
				$("#form input[name='fileTrans']").change(function(){
					if (!(window.File || window.FileReader || window.FileList || window.Blob)) {
					    alert('你妈喊你换Chrome浏览器啦');
					    return;
					}
					var files = $(this).prop('files');//通过文件域获取到文件列表
					if(!files || files.length == 0){
						alert('请选择文件');
						return;
					}
					$.eachFiles(files);
				}).dragToDrop(function(files){ //通过拖拽获取文件列表
					var flieStyle = $("#flieStyle");
					if(files && files.length > 0){
						$.eachFiles(files);
						flieStyle.animate({"border-color":"#000"}, 10, "swing");
						return;
					}
					var color = RBGToHex(flieStyle.css("border-color")) == RBGToHex(HexToRGB("#0ff")) ? "#000" : "#0ff";
					//console.log(RBGToHex(HexToRGB(color)))
					flieStyle.animate({"border-color":color}, 10, "swing")
				});
			});
		</script>
	</head>
	<body>
		<h1>媒体文件 转 base64 编码</h1>
		<div style="font-size:12px;color:gray;margin-bottom:10px;">PS:选择一个或多个文件,如果是音频格式并且您的浏览器支持,便可能会听到 base64 编码后的声音。</div>
		<form id="form" >
			<div id="flieStyle" style="border:dashed 1px black;background-color:snow;width:150px;height:150px;position:relative;line-height:2rem;font-size:12px;margin:30px auto;">
		    	<input type="file" name="fileTrans" multiple="multiple" style="width:150px;height:150px;position:absolute;opacity:0;background-color:black;">
		    	<span style="text-align:center;width:100%;margin-top:2.5rem;display:block;"><input type="button" value="点击选择文件"><br>拖动文件到此框中</span>
			</div>
		</form>
		<div id="look"></div>
	</body>
</html>

 

媒体文件 转 base64 编码

PS:选择一个或多个文件,如果是音频格式并且您的浏览器支持,便可能会听到 base64 编码后的声音。

拖动文件到此框中
 

 

posted @ 2017-11-27 07:42  锐洋智能  阅读(6728)  评论(0编辑  收藏  举报