benzleung / benz-amr-recorder Goto Github PK
View Code? Open in Web Editor NEWPlay, record, reformat AMR audio
Home Page: https://benzleung.github.io/benz-amr-recorder/demo.html
License: MIT License
Play, record, reformat AMR audio
Home Page: https://benzleung.github.io/benz-amr-recorder/demo.html
License: MIT License
Uncaught (in promise) TypeError: Failed to execute 'decodeAudioData' on 'BaseAudioContext': parameter 1 is not of type 'ArrayBuffer'.
如题,我看最终可以转换成 amr 或者mp3, 那么 ,aac格式的支持吗?
有这样简单的需求,通过不同的url播放不同的arm文件,但是benz-amr-recorder已经痛殴url初始化了。无法再次初始化,不能实现类似音乐播放切换音乐的效果
与ios9 不兼容
我是用的uglifyjs-webpack-plugin,但是还是会报错呢,能介绍下方法么
Chrome浏览器报警告The AudioContext was not allowed to start. It must be resumed (or created) after a user gesture on the page. https://goo.gl/7K7WLu
代码是 let soundInstance = new BenzAMRRecorder();
然后报错
TypeError: Cannot read property 'AudioContext' of undefined
at BenzAMRRecorder.js?t=wechat&s=1612677238981&v=6bc5d1f35f8f610d9ca7773c0ee5478b:290
at BenzAMRRecorder.js?t=wechat&s=1612677238981&v=6bc5d1f35f8f610d9ca7773c0ee5478b:2
at BenzAMRRecorder.js?t=wechat&s=1612677238981&v=6bc5d1f35f8f610d9ca7773c0ee5478b:5
at require (VM5786 WAService.js:2)
at VM5786 WAService.js:2
at index.js? [sm]:6
at require (VM5786 WAService.js:2)
at :996:9
at doWhenAllScriptLoaded (:1175:21)
at Object.scriptLoaded (:1195:5)
const BenzAMRRecorder = require('benz-amr-recorder')
<Button
onClick={() => {
var amr = new BenzAMRRecorder()
amr
.initWithUrl(
'https://static.tuputech.com/api/image/original/cloud-api/storage-0831/2019-08-01/10/5d0b3fb7a9fe1ca9c4f20707/15646272568190.2911486649597441.amr'
)
.then(function () {
amr.play()
})
amr.onEnded(function () {
console.log('object')
alert('播放完毕')
})
}}
>
点播放
</Button>
会发送请求 拿到数据 可是amr.play()不会执行 报错
Uncaught TypeError: Cannot read property 'slice' of null
at parseJSFunc (808055f6-876e-418e-aad5-6bdc5a02d6ca:602)
at 808055f6-876e-418e-aad5-6bdc5a02d6ca:614
at 808055f6-876e-418e-aad5-6bdc5a02d6ca:669
at 808055f6-876e-418e-aad5-6bdc5a02d6ca:30010
好像是AMR报错
function parseJSFunc(jsfunc) {
var parsed = jsfunc.toString().match(sourceRegex).slice(1); // 这句报错
return {
arguments: parsed[0],
body: parsed[1],
returnValue: parsed[2]
};
}
大佬有没例子可以提供下 我用了但是好像切换的时候 上一条还是会在播放 导致一起播放了
目前ipone上面测试一直不行, 安卓可以
前端项目是vue项目,语音文件链接是阿里云oss,直接访问与页面采用a标签都不会有问题。
只有initWithUrl发起xhr请求会报跨域。测试在微信开发者工具中也没有跨域问题,但是在浏览器里会。
如果播amr 正播放呢,我把这个页面销毁了,音频还在播放,除非我F5 刷新页面,
有没有别的处理方式,比如可以在 页面关闭时候调用amr 对象的 destroy() 方法类似的逻辑呢
或者有别的方法吗?
// 我先定义了一个这个,用来接受 amr 对象
const audioRef = useRef(); //audio标签Ref
// 定义 amr 并 赋值给 audioRef.current
const armOptions = {
src: audioInfo.src,
isloop: loop,
};
const amr = initArmObj(callBack, armOptions);
audioRef.current = amr;
// 当页面销毁时候手动置空
useEffect(() => {
return (() => {
// 如果是amr 类型文件,存在一直播放bug
if (ext === 'amr') {
audioRef.current.stop();
}
// 销毁音频组件
audioRef.current = null;
});
}, [ext]);
长按调initWithRecord
方法进行初始化,在then回调里面调startRecord
方法进行录音,大概过了5,6秒结束,经常性会出现无录音的情况,此时BenzAmrRecord
对象如下。版本:1.1.3
_blob: Blob {size: 6, type: "audio/amr"}
_isInit: true
_isInitRecorder: true
_isPaused: false
_isPlaying: false
_onAutoEnded: null
_onCancelRecord: ƒ ()
_onEndCallback: ƒ ()
_onEnded: null
_onFinishRecord: ƒ ()
_onPause: null
_onPlay: null
_onResume: null
_onStartRecord: ƒ ()
_onStop: null
_pauseTime: 0
_playEmpty: ƒ ()
_rawData: Uint8Array(6) [35, 33, 65, 77, 82, 10]
_recorderControl: RecorderControl {_recorderStream: null, _recorderStreamSourceNode: MediaStreamAudioSourceNode, _recorder: null, _isRecording: false, _curSourceNode: AudioBufferSourceNode}
_runAMRWorker: ƒ (msg, resolve)
_samples: Float32Array []
_startCtxTime: 0
__proto__: Object
node .electron-vue/build.js && electron-builder ?
项目中的音频是存在别的服务器上的,使用这个会报跨域的错误
提示this.te 不是个函数,检查了min文件发现,是把_playEmpty()函数替换成了te,但是_defineProperty仍然注册为_playEmpty,所以报错。
另外我尝试把this.te手动替换成this._playEmpty,这个错误就跳过去了,但是仍然有其他报错,所以这个min文件根本无法运行,能否重新打包?
您好!我在做一个聊天室,可能一个音频文件还没播放结束就会点击另外一条语音,播放另外一条文件,请问如何实现?
如果我使用
amr.initWithUrl('new file url.amr').then(function() {
amr.play();
});
amr.onEnded(function() {
alert('播放完毕');
})
就报错说arm已存在,如果我使用
var amr = new BenzAMRRecorder();
amr.initWithUrl('path/to/voice.amr').then(function() {
amr.play();
});
amr.onEnded(function() {
alert('播放完毕');
})
重新new 实例化一个,就提示arm不存在,好像new 下一行不能紧接着使用initWithUrl方法,请问如何处理比较好?能不能我个changeUrl方法呢
因为没有pause方法,只能用stop方法停止,但是stop方法会执行onended事件,这样就无法区分是播放结束还是人为停止,希望可以区分stop和end
How to use seekbar/progressbar? Or If I want to forward the audio then how will I do that?
How to play file at certain time point?
safari播放demo页面也没有声音,并且BenzAMRRecorder.isPlaySupported();打印出来是true。请问这个怎么解决
为什么主动调用stop()结束正在播放的语音会触发两次onStop事件?
为什么我现在控制不了暂停
state ={
isPlay: false
}
playAmrFile(url) {
this.setState({
isPlay: !this.state.isPlay
}, () => {
amr = new BenzAMRRecorder();
amr.initWithUrl(url).then( () => {
if(this.state.isPlay){
amr.playOrPauseOrResume();
} else {
amr.stop()
}
});
})
}
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:963)
Caused by: java.lang.IllegalStateException: convert amr to mp3 error:
at it.sauronsoftware.jave.AudioUtils.convert(AudioUtils.java:60)
at it.sauronsoftware.jave.AudioUtils.amrToMp3(AudioUtils.java:34)
at com.example.salemen.Recording.PhoneCallReceiver.amrToMp3(PhoneCallReceiver.java:317)
at com.example.salemen.Recording.PhoneCallReceiver.onOutgoingCallEnded(PhoneCallReceiver.java:208)
at com.example.salemen.Recording.PhoneCallReceiver.onReceive(PhoneCallReceiver.java:100)
at android.app.ActivityThread.handleReceiver(ActivityThread.java:3793)
at android.app.ActivityThread.-wrap18(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2100)
at android.os.Handler.dispatchMessage(Handler.java:109)
at android.os.Looper.loop(Looper.java:166)
at android.app.ActivityThread.main(ActivityThread.java:7555)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:469)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:963)
Caused by: it.sauronsoftware.jave.EncoderException: java.io.IOException: Cannot run program "/data/user/0/com.example.salemen/cache/jave-1/ffmpeg": error=13, Permission denied
at it.sauronsoftware.jave.Encoder.encode(Encoder.java:830)
at it.sauronsoftware.jave.Encoder.encode(Encoder.java:712)
at it.sauronsoftware.jave.AudioUtils.convert(AudioUtils.java:58)
at it.sauronsoftware.jave.AudioUtils.amrToMp3(AudioUtils.java:34)
at com.example.salemen.Recording.PhoneCallReceiver.amrToMp3(PhoneCallReceiver.java:317)
at com.example.salemen.Recording.PhoneCallReceiver.onOutgoingCallEnded(PhoneCallReceiver.java:208)
at com.example.salemen.Recording.PhoneCallReceiver.onReceive(PhoneCallReceiver.java:100)
at android.app.ActivityThread.handleReceiver(ActivityThread.java:3793)
at android.app.ActivityThread.-wrap18(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2100)
at android.os.Handler.dispatchMessage(Handler.java:109)
at android.os.Looper.loop(Looper.java:166)
at android.app.ActivityThread.main(ActivityThread.java:7555)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:469)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:963)
Caused by: java.io.IOException: Cannot run program "/data/user/0/com.example.salemen/cache/jave-1/ffmpeg": error=13, Permission denied
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
at java.lang.Runtime.exec(Runtime.java:692)
at java.lang.Runtime.exec(Runtime.java:560)
at it.sauronsoftware.jave.FFMPEGExecutor.execute(FFMPEGExecutor.java:105)
at it.sauronsoftware.jave.Encoder.encode(Encoder.java:828)
at it.sauronsoftware.jave.Encoder.encode(Encoder.java:712)
at it.sauronsoftware.jave.AudioUtils.convert(AudioUtils.java:58)
at it.sauronsoftware.jave.AudioUtils.amrToMp3(AudioUtils.java:34)
at com.example.salemen.Recording.PhoneCallReceiver.amrToMp3(PhoneCallReceiver.java:317)
at com.example.salemen.Recording.PhoneCallReceiver.onOutgoingCallEnded(PhoneCallReceiver.java:208)
at com.example.salemen.Recording.PhoneCallReceiver.onReceive(PhoneCallReceiver.java:100)
at android.app.ActivityThread.handleReceiver(ActivityThread.java:3793)
at android.app.ActivityThread.-wrap18(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2100)
at android.os.Handler.dispatchMessage(Handler.java:109)
at android.os.Looper.loop(Looper.java:166)
at android.app.ActivityThread.main(ActivityThread.java:7555)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:469)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:963)
Caused by: java.io.IOException: error=13, Permission denied
at java.lang.UNIXProcess.forkAndExec(Native Method)
at java.lang.UNIXProcess.(UNIXProcess.java:133)
at java.lang.ProcessImpl.start(ProcessImpl.java:128)
rt.
后端需要MP3格式,MP3兼容性好。。
然后现在就有个很尴尬的问题:其他插件不支持amr,这个插件不支持MP3(是不是打开方式不对)
求助~
在示例网页上也是,有的amr文件可以正常加载,有的会这样,请教一下这个是跟文件格式有关系还是什么问题
@BenzLeung 感谢回复,音乐切换有两个细节问题
场景是这样的:我有多个播放按钮是异步获取音乐的url, 但是我只能播放某一个音乐:
场景:双方聊天多个语音,每次播放都只能新创建一个,这样会造成同时有多个语音在播放
你好,请问怎么动态切换链接地址呢?
初始化一个外网地址,出现跨域问题
var amr = new BenzAMRRecorder();
amr.initWithUrl("http://www.baidu.com/"+ data.result.voice_address).then(function() {
amr.play();
});
amr.onEnded(function() {
alert('播放完毕');
})
如题,经过查阅,audio/amr-wb是宽带,audio/amr后者是窄带
AMR NB的语音带宽范围:300-3400Hz,8KHz采样
AMR WB的语音带宽范围: 50-7000Hz,16KHz采样
有没有什么比较好的处理方法呢?
以及,如果我想在源码基础上做一些更改,请问,哪些文件是必要的? 和demo.html 同级的 BenzAMRRecorder.js 我拿出来过,但是报了特别多的语法错误
大佬, ios9这个插件会引起js加载的时候就报错
报这个错
SyntaxError: Unexpected identifier 'ctx'
我们开发的时候没有使用里面的录音功能,录音我们用的是微信的sdk,我们只用了里面的amr读取播放,大佬,能不能将功能拆分开哦?
手机上的录音文件无法播放
53:1 Uncaught (in promise) DOMException: Unable to decode audio data
BenzAMRRecorder.js:30746 Uncaught (in promise) Error: Failed to decode.
[该录音为系统自动通话录音
Uncaught ReferenceError: _typeof is not defined
at Object.open (8e8bdf9e-d4c0-4737-bebc-063804e23f6b:2)
at Object.createStandardStreams (8e8bdf9e-d4c0-4737-bebc-063804e23f6b:2)
at Object.init (8e8bdf9e-d4c0-4737-bebc-063804e23f6b:2)
at 8e8bdf9e-d4c0-4737-bebc-063804e23f6b:2
at callRuntimeCallbacks (8e8bdf9e-d4c0-4737-bebc-063804e23f6b:2)
at ensureInitRuntime (8e8bdf9e-d4c0-4737-bebc-063804e23f6b:2)
at doRun (8e8bdf9e-d4c0-4737-bebc-063804e23f6b:6)
at run (8e8bdf9e-d4c0-4737-bebc-063804e23f6b:6)
at 8e8bdf9e-d4c0-4737-bebc-063804e23f6b:6
at 8e8bdf9e-d4c0-4737-bebc-063804e23f6b:6
求教,h5页面可以正常解码播放,但是小程序嵌套这个h5后就不能播放了,谁能帮忙分析下是什么原因
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.