获取二进制数据并将其保存为.mp3文件Javascript
Take Binary data and save it as an .mp3 file Javascript
所以我有一个Node.js
脚本和一个Javascript文件相互通信,除了Node.js
应该返回.mp3
文件的数据之外,其他一切都正常。
数据是二进制的,看起来像胡言乱语,我该如何获取它返回的数据,并允许用户使用Javascript在网页上下载它?
顺便说一下,它使用http.responseText
获取数据。
Node.js代码
//initilization
var querystring = require('querystring');
var http = require('http');
var url = require('url');
var fileSystem = require('fs');
var path = require('path');
var util = require('util');
//convert function
function convert(voiceToUse, textToConvert, response)
{
console.log("Sending Convert Request...");
//data to send as a query
var data = querystring.stringify(
{
username: 'user',
password: 'pass',
action: 'convert',
voice: voiceToUse,
text: textToConvert
});
//options to use
var options = {
host: 'ws.ispeech.org',
port: 80,
path: '/api/rest/1.5',
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': data.length
}
};
//http post request
var req = http.request(options, function (res)
{
res.setEncoding('utf8');
res.on('data', function (chunk)
{
console.log("Body: " + chunk);
var fileId = chunk.substr(chunk.indexOf("fileid") + 7);
console.log("Converting File...");
download(fileId.substr(0, fileId.search("&")), response);
});
});
req.on('error', function (e)
{
console.log('problem with request: ' + e.message);
});
req.write(data);
req.end();
}
//download function
function download(id, response)
{
//data to send as a query
var data = querystring.stringify(
{
username: 'user',
password: 'pass',
action: 'download',
fileid: id
});
//options to use
var options = {
host: 'ws.ispeech.org',
port: 80,
path: '/api/rest/1.5',
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': data.length
}
};
//http post request
var req = http.request(options, function (res)
{
res.on('data', function (chunk)
{
if (JSON.stringify(res.headers).indexOf("audio/mp3") != -1)
{
console.log("Downloading Chunk...");
/*var fs = require('fs'),
str = 'string to append to file';
fs.open('test.mp3', 'a', 666, function (e, id)
{
fs.write(id, chunk, 0, chunk.length, 0, function ()
{
fs.close(id, function ()
{
});
});
});*/
response.write(chunk, "binary");
}
else
{
download(id, response);
}
});
res.on('end', function ()
{
if (JSON.stringify(res.headers).indexOf("audio/mp3") != -1){
response.end();
}
});
});
req.on('error', function (e)
{
console.log('problem with request: ' + e.message);
});
req.write(data);
req.end();
}
http = require('http');
fs = require('fs');
server = http.createServer( function(req, res) {
console.dir(req.param);
if (req.method == 'POST') {
console.log("POST");
var body = '';
req.on('data', function (data) {
body += data;
console.log("Partial body: " + body);
});
req.on('end', function () {
console.log("Body: " + body);
if(body){
convert('engfemale1', body, res);
res.writeHead(200, {
'Content-Type': 'audio/mp3',
'Content-Disposition': 'attachment; filename="tts.mp3"'
});
}
});
}
});
port = 8080;
server.listen(port);
console.log('Listening at port ' + port);
Javascript代码
console.log('begin');
var http = new XMLHttpRequest();
var params = "text=" + bodyText;
http.open("POST", "http://supersecretserver:8080", true);
http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
//http.setRequestHeader("Content-length", params.length);
//http.setRequestHeader("Connection", "close");
http.onreadystatechange = function() {
console.log('onreadystatechange');
if (http.readyState == 4 && http.status == 200) {
alert(http.responseText);//response text is binary mp3 data
}
else {
console.log('readyState=' + http.readyState + ', status: ' + http.status);
}
}
console.log('sending...')
http.send(params);
console.log('end');
您可以尝试使用数据URL:
<a href="data:audio/mpeg3;charset=utf-8;base64,Zm9vIGJhcg==">mp3 download</a>
虽然不是最好的浏览器支持。
也可以在音频标签中直接使用数据URL。
一个更好的解决方案是将mp3保存在服务器上的某个位置,并返回一个链接供mp3播放器使用。
相关文章:
- 如何使用javascript只加载mp3文件标题
- 获取二进制数据并将其保存为.mp3文件Javascript
- 如何将MP3文件播放到麦克风输入jQuery中
- 使链接播放.mp3文件
- JavaScript/HTML5音频:在Android Chrome中播放用户通过文件选择器加载的mp3文件
- 播放mp3文件之前,请参阅其他页面的javascript
- HTML5网络音频API wavesurfer.js在大型mp3文件上崩溃
- MP3文件未通过联机播放器播放
- 为什么不能在人行横道中选择“mp3”文件
- 我正在尝试一个接一个地播放一个 mp3 文件(一个作为介绍),但它不起作用.我该怎么做
- 是否可以使用 Javascript 或 jQuery 将 mp3 文件转换为 m4r
- 通过PHP从mp3文件中获取封面艺术并显示它
- 将 mp3 文件从另一台服务器下载到我的服务器
- 在点击时播放mp3文件与javascript
- 在主文件夹和子文件夹中搜索.mp3文件
- 离子如何创建一个mp3文件
- 基本 Web 音频 API 不播放 mp3 文件
- 节点 - 将 m3u8 流另存为 mp3 文件
- 动态路径变量播放音频.mp3文件 如何?D3 JavaScript 咖啡脚本
- 如何使用Jplayer播放多个mp3文件