bilibili / WebAV

WebAV is an SDK built on WebCodecs, designed for creating and editing video files on the web platform. WebAV 是基于 WebCodecs 构建的 SDK,用于在 Web 平台上创建/编辑视频文件。
https://bilibili.github.io/WebAV/
MIT License
932 stars 109 forks source link

linux下 chrome 无法进行音频编码 #117

Closed xeoshow closed 3 months ago

xeoshow commented 3 months ago

rocky linux 8.8,如下图,用的自定义素材的例子,捕获不到错误。

"@webav/av-cliper": "^0.9.0-beta.13",

image image

hughfenghen commented 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');
});
xeoshow commented 3 months ago

这个也看到了,是一样的情况。

image

xeoshow commented 3 months ago

经过远程调试,发现从根本上就是下面的错误: b5393b4c217316b550e0f4bd10b96fd

且由下面代码引起: https://github.com/hughfenghen/WebAV/blob/fb8ce5066bb1609bbfe889a83c425702f2f74385/packages/av-cliper/src/mp4-utils/index.ts#L71 33350bcf14ed90c1dc9dbef563b6620

xeoshow commented 3 months ago

修改方法应该需要判断下ad是否为null或者是否已经是close,或者try catch方式?

xeoshow commented 3 months ago

另外,onError或onEnded暴露为event,和onProgress一样,是否更符合设计实现的一致性?

hughfenghen commented 3 months ago

经过远程调试,发现从根本上就是下面的错误: b5393b4c217316b550e0f4bd10b96fd

且由下面代码引起:

https://github.com/hughfenghen/WebAV/blob/fb8ce5066bb1609bbfe889a83c425702f2f74385/packages/av-cliper/src/mp4-utils/index.ts#L71

33350bcf14ed90c1dc9dbef563b6620

断点看看 AudioEncorder 是否正常初始化成功,是什么原因被关闭了?

xeoshow commented 3 months ago

代码里没有add任何Audio相关的Sprite,也有触发这个报错,感觉还是很不合理的。音频逻辑应该解耦。

hughfenghen commented 3 months ago

Combinator 默认会保持音轨,即使没有音频素材。

https://github.com/hughfenghen/hughfenghen.github.io/issues/129#issuecomment-1586041964

使用这里的代码检测你的 linux chrome 是否支持 aac(mp4a.40.2)编码。

xeoshow commented 3 months ago

问题的原因找到,windows和linux其实都可以正常执行encoder.configure,但是linux下,error事件会触发,不知何故。 f0eba73fe1720233b94260bf0742fa9 4cadc8ac1863d757846ef35c979d0d6

hughfenghen commented 3 months ago

666,已经很接近真相了。

但是linux下,error事件会触发

具体抛出什么错误?请打印一下详细配置参数。

前面说 linux 通过了音频编码兼容性检测,WebAV 抛错的参数跟检测代码参数有什么区别?

hughfenghen commented 3 months ago

你去 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)
xeoshow commented 3 months ago

你去 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)

结果如下图所示: a9b705d0e8e7f2d8f1b74768a0b1d42

hughfenghen commented 3 months ago

你去 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)

结果如下图所示: a9b705d0e8e7f2d8f1b74768a0b1d42

我给的脚本代码显示,encoder 已经 创建成功了。

最后一个 Encoding error 是执行完脚本立即打印,还是等了一段时间才打印的错误?

是在控制台中运行我提供的代码导致的错误,还是你页面运行了其他代码导致的?

xeoshow commented 3 months ago

最后这个,就是运行你这个脚本时,一并出来的。和我们代码里情况本质是一致的

hughfenghen commented 3 months ago

ok 实锤 chrome 的 bug 了,给 chrome 提 Bug 吧。

xeoshow commented 3 months ago

ok 实锤 chrome 的 bug 了,给 chrome 提 Bug 吧。 chrome版本是目前最新的,如下。 我们不需要音频,可以有什么办法先绕开这块吗? 04e55253d44a2098a0c103954366fb5

xeoshow commented 3 months ago

现在合成没有加入任何音频,发现是 file.boxes.length导致return不能继续生成 709699bd1aa88f56b673beb7213e9b1 b2a3100d89aeaa39f1cd1f1e5d02ca3 dbbf1bb0f0138bac4a8b4769a3c2566

hughfenghen commented 3 months ago

chrome版本是目前最新的,如下。 我们不需要音频,可以有什么办法先绕开这块吗?

Combinator 将开放 API 允许消音

xeoshow commented 3 months ago

chrome版本是目前最新的,如下。 我们不需要音频,可以有什么办法先绕开这块吗?

Combinator 将开放 API 允许消音

就是合成时不再介入AudioEncoder的逻辑?那这样应该就恰好可以绕开linux chrome的问题。 前面截图了file.boxes相关信息,不知是否是绕开AudioEncoder导致。

hughfenghen commented 3 months ago

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,
});
xeoshow commented 3 months ago

请教下:也可以指定audioCodec吗?类似上面的videoCodec那样

hughfenghen commented 3 months ago

暂不支持 audioCodec,API 从小到大谨慎开放,有必要再开放。