Closed xeoshow closed 3 months ago
没有 onError 事件,最新是 beta16 版本
输出流错误捕获方式参考 单测用例
test('Combinator.output throw an error', async () => {
const spr = new OffscreenSprite(
new (class MockClip implements IClip {
tick = async () => {
throw Error('xxx');
};
meta = { width: 0, height: 0, duration: 0 };
ready = Promise.resolve(this.meta);
clone = async () => new MockClip() as this;
destroy = () => {};
split = async (_: number) =>
[new MockClip(), new MockClip()] as [this, this];
})(),
);
const com = new Combinator();
await com.addSprite(spr);
const reader = com.output().getReader();
expect(async () => {
await reader.read();
}).rejects.toThrowError('xxx');
});
这个也看到了,是一样的情况。
经过远程调试,发现从根本上就是下面的错误:
修改方法应该需要判断下ad是否为null或者是否已经是close,或者try catch方式?
另外,onError或onEnded暴露为event,和onProgress一样,是否更符合设计实现的一致性?
经过远程调试,发现从根本上就是下面的错误:
且由下面代码引起:
断点看看 AudioEncorder 是否正常初始化成功,是什么原因被关闭了?
代码里没有add任何Audio相关的Sprite,也有触发这个报错,感觉还是很不合理的。音频逻辑应该解耦。
Combinator 默认会保持音轨,即使没有音频素材。
https://github.com/hughfenghen/hughfenghen.github.io/issues/129#issuecomment-1586041964
使用这里的代码检测你的 linux chrome 是否支持 aac(mp4a.40.2)编码。
问题的原因找到,windows和linux其实都可以正常执行encoder.configure,但是linux下,error事件会触发,不知何故。
666,已经很接近真相了。
但是linux下,error事件会触发
具体抛出什么错误?请打印一下详细配置参数。
前面说 linux 通过了音频编码兼容性检测,WebAV 抛错的参数跟检测代码参数有什么区别?
你去 linux chrome 控制台执行以下代码,查看打印结果
const config = {
codec: 'mp4a.40.2',
sampleRate: 48000,
numberOfChannels: 2,
}
console.log('AudioEncoder.isConfigSupported: ', (await AudioEncoder.isConfigSupported(config)).supported);
const encoder = new AudioEncoder({
error: console.error,
output: () => {}
})
encoder.configure(config)
console.log('encoder.state', encoder.state)
你去 linux chrome 控制台执行以下代码,查看打印结果
const config = { codec: 'mp4a.40.2', sampleRate: 48000, numberOfChannels: 2, } console.log('AudioEncoder.isConfigSupported: ', (await AudioEncoder.isConfigSupported(config)).supported); const encoder = new AudioEncoder({ error: console.error, output: () => {} }) encoder.configure(config) console.log('encoder.state', encoder.state)
结果如下图所示:
你去 linux chrome 控制台执行以下代码,查看打印结果
const config = { codec: 'mp4a.40.2', sampleRate: 48000, numberOfChannels: 2, } console.log('AudioEncoder.isConfigSupported: ', (await AudioEncoder.isConfigSupported(config)).supported); const encoder = new AudioEncoder({ error: console.error, output: () => {} }) encoder.configure(config) console.log('encoder.state', encoder.state)
结果如下图所示:
我给的脚本代码显示,encoder 已经 创建成功了。
最后一个 Encoding error
是执行完脚本立即打印,还是等了一段时间才打印的错误?
是在控制台中运行我提供的代码导致的错误,还是你页面运行了其他代码导致的?
最后这个,就是运行你这个脚本时,一并出来的。和我们代码里情况本质是一致的
ok 实锤 chrome 的 bug 了,给 chrome 提 Bug 吧。
ok 实锤 chrome 的 bug 了,给 chrome 提 Bug 吧。 chrome版本是目前最新的,如下。 我们不需要音频,可以有什么办法先绕开这块吗?
现在合成没有加入任何音频,发现是 file.boxes.length导致return不能继续生成
chrome版本是目前最新的,如下。 我们不需要音频,可以有什么办法先绕开这块吗?
Combinator 将开放 API 允许消音
chrome版本是目前最新的,如下。 我们不需要音频,可以有什么办法先绕开这块吗?
Combinator 将开放 API 允许消音
就是合成时不再介入AudioEncoder的逻辑?那这样应该就恰好可以绕开linux chrome的问题。 前面截图了file.boxes相关信息,不知是否是绕开AudioEncoder导致。
av-cliper@0.9.0-beta.19
支持 Combinator 排除音轨 (audio: false)。
const com = new Combinator({
width: 1280,
height: 720,
videoCodec: 'avc1.42E032',
bgColor: 'white',
audio: false,
});
请教下:也可以指定audioCodec吗?类似上面的videoCodec那样
暂不支持 audioCodec,API 从小到大谨慎开放,有必要再开放。
rocky linux 8.8,如下图,用的自定义素材的例子,捕获不到错误。
"@webav/av-cliper": "^0.9.0-beta.13",