Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于vite和avPlayer的一些讨论 #5

Closed
imzlh opened this issue Jul 21, 2024 · 45 comments
Closed

关于vite和avPlayer的一些讨论 #5

imzlh opened this issue Jul 21, 2024 · 45 comments

Comments

@imzlh
Copy link

imzlh commented Jul 21, 2024

我是忠实的vite用户,然后想要libmedia与vue+vite集成,于是在npm里写上了

{"dependencies": {"libmedia": "https://github.com/zhaohappy/libmedia.git"}}

然后在项目里引用

import AVPlayer from 'libmedia/src/avplayer/AVPlayer';

然后vite就报错了

Error: Build failed with 84 errors:
node_modules/libmedia/src/avplayer/AVPlayer.ts:26:39: ERROR: Could not resolve "avutil/codec"
node_modules/libmedia/src/avplayer/AVPlayer.ts:27:35: ERROR: Could not resolve "avpipeline/IOPipeline"
node_modules/libmedia/src/avplayer/AVPlayer.ts:28:26: ERROR: Could not resolve "avpipeline/DemuxPipeline"
node_modules/libmedia/src/avplayer/AVPlayer.ts:29:32: ERROR: Could not resolve "avpipeline/VideoDecodePipeline"
node_modules/libmedia/src/avplayer/AVPlayer.ts:30:32: ERROR: Could not resolve "avpipeline/AudioDecodePipeline"
...
at failureErrorWithLog (E:.docs\文档\vlist\node_modules\esbuild\lib\main.js:1651:15)
at E:.docs\文档\vlist\node_modules\esbuild\lib\main.js:1059:25
at E:.docs\文档\vlist\node_modules\esbuild\lib\main.js:1527:9
at process.processTicksAndRejections (node:internal/process/task_queues:95:5) {
errors: [Getter/Setter],
warnings: [Getter/Setter]
}

Node.js v20.12.2

但是VSCode没有报错。请问该怎么解决呢

@zhaohappy
Copy link
Owner

上面这个错应该是 vite 没有设置包的 alias 路径;但是即便设置了也是不能编译的。libmedia 只能使用 webpack 来编译,不仅仅是 cheap 的编译插件目前只有 webpack,还用到了一些 webpack 打包的特性。你这边我建议你通过本项目编译出 avplayer ,在拷贝到你的 vite 工程里面使用。

@imzlh
Copy link
Author

imzlh commented Jul 21, 2024

明白,是Cheap struct的特殊语法不支持
但是使用存储库里dist/文件夹里的AVPlayer.js还是报错了
image
这个能通过参数改chunk地址吗

@zhaohappy
Copy link
Owner

不能设置,chunk 需要和 avplayer 主文件打包之后的文件在同一个目录下;要么使用 script 标签引入,所有 avplayer 文件放同一个目录下;要么编译打包 avplayer 的时候去掉所有的动态 import 全打包成一个文件;我对 vite 不太熟悉,你可以看一下有没有可以处理这种依赖关系的配置。

@imzlh
Copy link
Author

imzlh commented Jul 21, 2024

我有个问题,这个库应该是跟随时代的潮流的,那为什么不使用ESModule的方式导入呢
是WebPack转换成了AMD、CommonJS模块还是原项目就是这么设计的?
看了一下源码,好像没有用到require(),也没有eval()或者new Function()(),那这个chunk是怎么导入的
我使用了vite-plugin-require-transform这个插件,大概是兼容性问题,吧......
(本人WebPack和AMD/CJS了解不多)

@yzydeveloper
Copy link
Contributor

我有个问题,这个库应该是跟随时代的潮流的,那为什么不使用ESModule的方式导入呢 是WebPack转换成了AMD、CommonJS模块还是原项目就是这么设计的? 看了一下源码,好像没有用到require(),也没有eval()或者new Function()(),那这个chunk是怎么导入的 我使用了vite-plugin-require-transform这个插件,大概是兼容性问题,吧...... (本人WebPack和AMD/CJS了解不多)

1、webpack构建决定了最终的产物的格式(commonjs、amd),由于libmedia底层的插件目前仅支持了webpack,所以只能用webpack去构建产物
2、chunk是webpack构建是动态生成的,vite目前是不兼容的动态生成的产物(可以自己写插件做)

解决方案:fork此仓库的代码,将avplayer中动态导入的代码全替换为静态(import("xxx")这种代码),然后使用vite再做一层封装,将avplayer的产物构建为es

@imzlh
Copy link
Author

imzlh commented Jul 22, 2024

我使用了script大法,但是额还是报错
image
image
还有我的设备不支持WebGPU,因此禁用了(自己实现的逻辑)
image

@zhaohappy
Copy link
Owner

你这个视频可以发上来看一下吗

@imzlh
Copy link
Author

imzlh commented Jul 22, 2024

你有IPV6吗,我可以给你临时链接

@zhaohappy
Copy link
Owner

应该可以,给出来试一下

@imzlh
Copy link
Author

imzlh commented Jul 22, 2024

???????链接已失效????????

@imzlh
Copy link
Author

imzlh commented Jul 22, 2024

还有一个建议,将不支持的编码自动剔除而不是报错
这个mkv文件中有默认的aac音轨和非默认的ac3音轨,但是avPlayer却报错了无法播放

(ffmpeg -i 001.mkv)
Stream #0:0: Video: hevc (Main 10), yuv420p10le(tv, bt709), 1920x1080, SAR 1:1 DAR 16:9, 23.98 fps, 23.98 tbr, 1k tbn (default)
Metadata:
title : Presented By EMBER
BPS : 1827989
DURATION : 00:23:43.422000000
NUMBER_OF_FRAMES: 34128
NUMBER_OF_BYTES : 325250043
_STATISTICS_WRITING_APP: mkvmerge v57.0.0 ('Till The End') 64-bit
_STATISTICS_WRITING_DATE_UTC: 2021-07-14 09:32:38
_STATISTICS_TAGS: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
Stream #0:1(eng): Audio: aac (LC), 44100 Hz, stereo, fltp (default)
Metadata:
title : Golumpa@CR
BPS : 128000
DURATION : 00:23:41.502000000
NUMBER_OF_FRAMES: 61219
NUMBER_OF_BYTES : 22744039
_STATISTICS_WRITING_APP: mkvmerge v57.0.0 ('Till The End') 64-bit
_STATISTICS_WRITING_DATE_UTC: 2021-07-14 09:32:38
_STATISTICS_TAGS: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
Stream #0:2(jpn): Audio: ac3, 48000 Hz, stereo, fltp, 192 kb/s
Metadata:
BPS : 192000
DURATION : 00:23:43.456000000
NUMBER_OF_FRAMES: 44483
NUMBER_OF_BYTES : 34162944
_STATISTICS_WRITING_APP: mkvmerge v57.0.0 ('Till The End') 64-bit
_STATISTICS_WRITING_DATE_UTC: 2021-07-14 09:32:38
_STATISTICS_TAGS: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES

image

@imzlh
Copy link
Author

imzlh commented Jul 22, 2024

试了一下官网的示例也是这个问题,播放了一段时间后就停止了,但是只发生在GPU无法硬解的时候
硬解AVC,一切正常(我使用的是Intel HD4600,无法硬解HEVC)
软解AV1似乎可以,但是播放很卡顿(CPU没有100%),且音画不同步播放10s左右后直接黑屏
看了一下是报错了

Error submitting a packet for decoding (Invalid data found when processing input)
[src/avpipeline/VideoDecodePipeline.ts][line 313] [error] video decode error, taskId: dc989be0-0495-48ad-af98-9ad1857f65e3, ret: -1094995529
avplayer.js:29559 [src/avpipeline/VideoRenderPipeline.ts][line 481] [info] video render ended, taskId: dc989be0-0495-48ad-af98-9ad1857f65e3

3个BUG

  • 同时看了一下.getAudioList(), .getVideoList(),都是空数组,无论何时都这样
  • 还有似乎第二次load()会报错
  • seek()无论设置为多少,都会从头重新播放

[src/avplayer/AVPlayer.ts][line 571] [error] register io task failed, ret: -5, taskId: 357c4269-6c41-40b2-b582-cb2e2e3429b4

@zhaohappy
Copy link
Owner

http://[2409:8a28:62f5:cfa4:2a75:d8ff:feb3:8481]:88/%5BLoliHouse%5D%202.5-jigen%20no%20Ririsa%20-%2003%20%5BWebRip%201080p%20HEVC-10bit%20AAC%20SRTx2%5D.mkv

这个修复了

@zhaohappy
Copy link
Owner

还有一个建议,将不支持的编码自动剔除而不是报错 这个mkv文件中有默认的aac音轨和非默认的ac3音轨,但是avPlayer却报错了无法播放

(ffmpeg -i 001.mkv) Stream #0:0: Video: hevc (Main 10), yuv420p10le(tv, bt709), 1920x1080, SAR 1:1 DAR 16:9, 23.98 fps, 23.98 tbr, 1k tbn (default) Metadata: title : Presented By EMBER BPS : 1827989 DURATION : 00:23:43.422000000 NUMBER_OF_FRAMES: 34128 NUMBER_OF_BYTES : 325250043 _STATISTICS_WRITING_APP: mkvmerge v57.0.0 ('Till The End') 64-bit _STATISTICS_WRITING_DATE_UTC: 2021-07-14 09:32:38 _STATISTICS_TAGS: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES Stream #0:1(eng): Audio: aac (LC), 44100 Hz, stereo, fltp (default) Metadata: title : Golumpa@CR BPS : 128000 DURATION : 00:23:41.502000000 NUMBER_OF_FRAMES: 61219 NUMBER_OF_BYTES : 22744039 _STATISTICS_WRITING_APP: mkvmerge v57.0.0 ('Till The End') 64-bit _STATISTICS_WRITING_DATE_UTC: 2021-07-14 09:32:38 _STATISTICS_TAGS: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES Stream #0:2(jpn): Audio: ac3, 48000 Hz, stereo, fltp, 192 kb/s Metadata: BPS : 192000 DURATION : 00:23:43.456000000 NUMBER_OF_FRAMES: 44483 NUMBER_OF_BYTES : 34162944 _STATISTICS_WRITING_APP: mkvmerge v57.0.0 ('Till The End') 64-bit _STATISTICS_WRITING_DATE_UTC: 2021-07-14 09:32:38 _STATISTICS_TAGS: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES

image

这个应该也可以了

@zhaohappy
Copy link
Owner

zhaohappy commented Jul 22, 2024

试了一下官网的示例也是这个问题,播放了一段时间后就停止了,但是只发生在GPU无法硬解的时候 硬解AVC,一切正常(我使用的是Intel HD4600,无法硬解HEVC) 软解AV1似乎可以,但是播放很卡顿(CPU没有100%),且音画不同步播放10s左右后直接黑屏 看了一下是报错了

Error submitting a packet for decoding (Invalid data found when processing input)
[src/avpipeline/VideoDecodePipeline.ts][line 313] [error] video decode error, taskId: dc989be0-0495-48ad-af98-9ad1857f65e3, ret: -1094995529
avplayer.js:29559 [src/avpipeline/VideoRenderPipeline.ts][line 481] [info] video render ended, taskId: dc989be0-0495-48ad-af98-9ad1857f65e3

3个BUG

  • 同时看了一下.getAudioList(), .getVideoList(),都是空数组,无论何时都这样
  • 还有似乎第二次load()会报错
  • seek()无论设置为多少,都会从头重新播放

[src/avplayer/AVPlayer.ts][line 571] [error] register io task failed, ret: -5, taskId: 357c4269-6c41-40b2-b582-cb2e2e3429b4

顺便说,我喜欢这个项目,如果成功就不用在各个终端下载播放器APP,对着广告和各种限制生气了

解码失败的视频发一下吧,需要看看
getAudioList(), .getVideoList() 原本是给 hls 和 dash 用的,没有处理 mp4 和 mkv 多个 track 的情况;

seek 我知道什么问题了,已修复;

软解 av1 hevc 需要支持多线程才能提高体验

@imzlh
Copy link
Author

imzlh commented Jul 22, 2024

还是一样的视频,依旧是播放20s黑屏
seek()后似乎还是不正常,报错了

image

为了证明不是视频的问题,我使用ffplay一切没有问题

image

@imzlh
Copy link
Author

imzlh commented Jul 22, 2024

是最新的
image
官网的示例也是一样黑屏
image

@zhaohappy
Copy link
Owner

给一下你这个视频的链接

@imzlh
Copy link
Author

imzlh commented Jul 22, 2024

给一下你这个视频的链接

就是之前给的那个
好像是个例,且是随机出现,有的时候没问题。
这个视频没问题:

[src/avplayer/AVPlayer.ts][line 714] [info]
Input #0, mkv, from 'http://192.168.1.1:81//[Nekomoe kissaten&VCB-Studio] BanG Dream! It’s MyGO!!!!! [Ma10p_1080p]/001.mkv:'
Duration: 00:23:51.430, start: 00:00:00.000, bitrate: 3428 kbps/s
Stream #0:0 Video: hevc (Main10), yuv420p10le(tv, bt709), 1920x1080 [SAR: 1:1 DAR 16:9], 2293 kbps/s, 22.00 fps, 22.00 tbr, 1000 tbn, (default)
Metadata:
language: und
naluLengthSizeMinusOne: 3
Stream #0:1 Audio: flac, 48000 Hz, stereo, s32, 1069 kbps/s, (default)
Metadata:
language: jpn
Stream #0:2 Subtitle: 65 kbps/s
Metadata:
language: jpn
name: Japanese
Stream #0:3 Subtitle:
Metadata:
name: English
Stream #0:4 Subtitle:
Metadata:
language: kor
name: Korean
Stream #0:5 Subtitle:
Metadata:
language: chi
name: Traditional Chinese
Stream #0:6 Subtitle:
Metadata:
language: chi
name: Simplified Chinese

@imzlh
Copy link
Author

imzlh commented Jul 22, 2024

试了一下官网的示例也是这个问题,播放了一段时间后就停止了,但是只发生在GPU无法硬解的时候 硬解AVC,一切正常(我使用的是Intel HD4600,无法硬解HEVC) 软解AV1似乎可以,但是播放很卡顿(CPU没有100%),且音画不同步播放10s左右后直接黑屏 看了一下是报错了

Error submitting a packet for decoding (Invalid data found when processing input)
[src/avpipeline/VideoDecodePipeline.ts][line 313] [error] video decode error, taskId: dc989be0-0495-48ad-af98-9ad1857f65e3, ret: -1094995529
avplayer.js:29559 [src/avpipeline/VideoRenderPipeline.ts][line 481] [info] video render ended, taskId: dc989be0-0495-48ad-af98-9ad1857f65e3

3个BUG

  • 同时看了一下.getAudioList(), .getVideoList(),都是空数组,无论何时都这样
  • 还有似乎第二次load()会报错
  • seek()无论设置为多少,都会从头重新播放

[src/avplayer/AVPlayer.ts][line 571] [error] register io task failed, ret: -5, taskId: 357c4269-6c41-40b2-b582-cb2e2e3429b4

顺便说,我喜欢这个项目,如果成功就不用在各个终端下载播放器APP,对着广告和各种限制生气了

解码失败的视频发一下吧,需要看看 getAudioList(), .getVideoList() 原本是给 hls 和 dash 用的,没有处理 mp4 和 mkv 多个 track 的情况;

seek 我知道什么问题了,已修复;

软解 av1 hevc 需要支持多线程才能提高体验

可是CPU没有占100%啊,但是帧率只有可怜的6fps

image

可不可以像vlc那样,少解码的帧直接舍弃以保证流畅度?(弱弱地说)

@imzlh
Copy link
Author

imzlh commented Jul 22, 2024

我觉得吧,要是libmedia可以修改活动音轨或者视频轨道、提取字幕轨道(不是解码渲染)会更好
如果是大视频网站的话直接转码就行,像bilibili,而这个项目应该是看NAS视频的居多
这个时候这个功能就比较重要了,应该实现也不难,希望考虑

@zhaohappy
Copy link
Owner

试了一下官网的示例也是这个问题,播放了一段时间后就停止了,但是只发生在GPU无法硬解的时候 硬解AVC,一切正常(我使用的是Intel HD4600,无法硬解HEVC) 软解AV1似乎可以,但是播放很卡顿(CPU没有100%),且音画不同步播放10s左右后直接黑屏 看了一下是报错了

Error submitting a packet for decoding (Invalid data found when processing input)
[src/avpipeline/VideoDecodePipeline.ts][line 313] [error] video decode error, taskId: dc989be0-0495-48ad-af98-9ad1857f65e3, ret: -1094995529
avplayer.js:29559 [src/avpipeline/VideoRenderPipeline.ts][line 481] [info] video render ended, taskId: dc989be0-0495-48ad-af98-9ad1857f65e3

3个BUG

  • 同时看了一下.getAudioList(), .getVideoList(),都是空数组,无论何时都这样
  • 还有似乎第二次load()会报错
  • seek()无论设置为多少,都会从头重新播放

[src/avplayer/AVPlayer.ts][line 571] [error] register io task failed, ret: -5, taskId: 357c4269-6c41-40b2-b582-cb2e2e3429b4

顺便说,我喜欢这个项目,如果成功就不用在各个终端下载播放器APP,对着广告和各种限制生气了

解码失败的视频发一下吧,需要看看 getAudioList(), .getVideoList() 原本是给 hls 和 dash 用的,没有处理 mp4 和 mkv 多个 track 的情况;
seek 我知道什么问题了,已修复;
软解 av1 hevc 需要支持多线程才能提高体验

可是CPU没有占100%啊,但是帧率只有可怜的6fps

image 可不可以像vlc那样,少解码的帧直接舍弃以保证流畅度?(弱弱地说)

单线程看单核的 cpu 占用,window 上的 cpu 占用率分母是所有核

@zhaohappy
Copy link
Owner

我觉得吧,要是libmedia可以修改活动音轨或者视频轨道、提取字幕轨道(不是解码渲染)会更好 如果是大视频网站的话直接转码就行,像bilibili,而这个项目应该是看NAS视频的居多 这个时候这个功能就比较重要了,应该实现也不难,希望考虑

解码是大头,渲染开销很少,解码要丢帧需要视频是时域分层的,一般的视频都不是

@zhaohappy
Copy link
Owner

zhaohappy commented Jul 22, 2024

试了一下官网的示例也是这个问题,播放了一段时间后就停止了,但是只发生在GPU无法硬解的时候 硬解AVC,一切正常(我使用的是Intel HD4600,无法硬解HEVC) 软解AV1似乎可以,但是播放很卡顿(CPU没有100%),且音画不同步播放10s左右后直接黑屏 看了一下是报错了

Error submitting a packet for decoding (Invalid data found when processing input)
[src/avpipeline/VideoDecodePipeline.ts][line 313] [error] video decode error, taskId: dc989be0-0495-48ad-af98-9ad1857f65e3, ret: -1094995529
avplayer.js:29559 [src/avpipeline/VideoRenderPipeline.ts][line 481] [info] video render ended, taskId: dc989be0-0495-48ad-af98-9ad1857f65e3

3个BUG

  • 同时看了一下.getAudioList(), .getVideoList(),都是空数组,无论何时都这样
  • 还有似乎第二次load()会报错
  • seek()无论设置为多少,都会从头重新播放

[src/avplayer/AVPlayer.ts][line 571] [error] register io task failed, ret: -5, taskId: 357c4269-6c41-40b2-b582-cb2e2e3429b4

顺便说,我喜欢这个项目,如果成功就不用在各个终端下载播放器APP,对着广告和各种限制生气了

解码失败的视频发一下吧,需要看看 getAudioList(), .getVideoList() 原本是给 hls 和 dash 用的,没有处理 mp4 和 mkv 多个 track 的情况;
seek 我知道什么问题了,已修复;
软解 av1 hevc 需要支持多线程才能提高体验

可是CPU没有占100%啊,但是帧率只有可怜的6fps
image
可不可以像vlc那样,少解码的帧直接舍弃以保证流畅度?(弱弱地说)

单线程看单核的 cpu 占用,window 上的 cpu 占用率分母是所有核

才 1080p 也不至于才 6 帧的帧率才对,我的 m1 电脑上播放你那个视频单线程只占用单个核的 60%,simd 的只有 30% 多,才看见你的 cpu 是 i5-4430,这多少年前的 cpu 了。

@zhaohappy
Copy link
Owner

zhaohappy commented Jul 22, 2024

是最新的 image 官网的示例也是一样黑屏 image

这回是真可以了

@imzlh
Copy link
Author

imzlh commented Jul 22, 2024

试了一下官网的示例也是这个问题,播放了一段时间后就停止了,但是只发生在GPU无法硬解的时候 硬解AVC,一切正常(我使用的是Intel HD4600,无法硬解HEVC) 软解AV1似乎可以,但是播放很卡顿(CPU没有100%),且音画不同步播放10s左右后直接黑屏 看了一下是报错了

Error submitting a packet for decoding (Invalid data found when processing input)
[src/avpipeline/VideoDecodePipeline.ts][line 313] [error] video decode error, taskId: dc989be0-0495-48ad-af98-9ad1857f65e3, ret: -1094995529
avplayer.js:29559 [src/avpipeline/VideoRenderPipeline.ts][line 481] [info] video render ended, taskId: dc989be0-0495-48ad-af98-9ad1857f65e3

3个BUG

  • 同时看了一下.getAudioList(), .getVideoList(),都是空数组,无论何时都这样
  • 还有似乎第二次load()会报错
  • seek()无论设置为多少,都会从头重新播放

[src/avplayer/AVPlayer.ts][line 571] [error] register io task failed, ret: -5, taskId: 357c4269-6c41-40b2-b582-cb2e2e3429b4

顺便说,我喜欢这个项目,如果成功就不用在各个终端下载播放器APP,对着广告和各种限制生气了

解码失败的视频发一下吧,需要看看 getAudioList(), .getVideoList() 原本是给 hls 和 dash 用的,没有处理 mp4 和 mkv 多个 track 的情况;
seek 我知道什么问题了,已修复;
软解 av1 hevc 需要支持多线程才能提高体验

可是CPU没有占100%啊,但是帧率只有可怜的6fps
image
可不可以像vlc那样,少解码的帧直接舍弃以保证流畅度?(弱弱地说)

单线程看单核的 cpu 占用,window 上的 cpu 占用率分母是所有核

这个界面就是单核心的

image

这颗4代处理器性能不弱的,可以轻松软解AV1

image

我确定不是CPU瓶颈,众所周知Intel被叫做牙膏厂是有原因的
6代及以后就可以硬解HEVC了,因此用4代调试也有原因的


我觉得丢帧可以考虑下,实在不行setTimeout发现超时了直接seek()也可以

@imzlh imzlh changed the title vite报错Could not resolve... 关于vite和avPlayer的一些讨论 Jul 22, 2024
@imzlh
Copy link
Author

imzlh commented Jul 22, 2024

我觉得吧,要是libmedia可以修改活动音轨或者视频轨道、提取字幕轨道(不是解码渲染)会更好 如果是大视频网站的话直接转码就行,像bilibili,而这个项目应该是看NAS视频的居多 这个时候这个功能就比较重要了,应该实现也不难,希望考虑

解码是大头,渲染开销很少,解码要丢帧需要视频是时域分层的,一般的视频都不是

抱歉,我现在又去翻了一下定义,才发现getStreams()这个方法。哎,我瞎了
请问如何从codecpar里提取轨道类型(视频/音频/字幕)呢

@imzlh
Copy link
Author

imzlh commented Jul 23, 2024

我看了很久,知道codecpar是一个指针
在浏览器运行情况下,codecpar是一个Number
然后又想不明白,为什么这里能直接访问读写这个指针

stream.codecpar.profile = profile
stream.codecpar.sampleRate = sampleRate
stream.codecpar.chLayout.nbChannels = channelCount

请告诉我,codecpar该怎么解析呢,我想要知道stream的类型

@zhaohappy
Copy link
Owner

我看了很久,知道codecpar是一个指针 在浏览器运行情况下,codecpar是一个Number 然后又想不明白,为什么这里能直接访问读写这个指针

stream.codecpar.profile = profile
stream.codecpar.sampleRate = sampleRate
stream.codecpar.chLayout.nbChannels = channelCount

请告诉我,codecpar该怎么解析呢,我想要知道stream的类型

指针访问属性只能在 cheap 这个框架下使用,最终由 cheap 的编译插件将其编译成对应的 js 代码。想在外面访问要么外面的代码也在 cheap 框架下然后用 cheap 编译;要么抛给外层的数据把指针变成结构体实例,结构体实例是一个 Proxy 代理,就可以通过 js 访问里面的属性。

@imzlh
Copy link
Author

imzlh commented Jul 23, 2024

我看了很久,知道codecpar是一个指针 在浏览器运行情况下,codecpar是一个Number 然后又想不明白,为什么这里能直接访问读写这个指针

stream.codecpar.profile = profile
stream.codecpar.sampleRate = sampleRate
stream.codecpar.chLayout.nbChannels = channelCount

请告诉我,codecpar该怎么解析呢,我想要知道stream的类型

指针访问属性只能在 cheap 这个框架下使用,最终由 cheap 的编译插件将其编译成对应的 js 代码。想在外面访问要么外面的代码也在 cheap 框架下然后用 cheap 编译;要么抛给外层的数据把指针变成结构体实例,结构体实例是一个 Proxy 代理,就可以通过 js 访问里面的属性。

可不可以改进一下getStreams(),把这个指针数据解析完传出Object,不然真的太迷惑了根本无法判断

@zhaohappy
Copy link
Owner

我看了很久,知道codecpar是一个指针 在浏览器运行情况下,codecpar是一个Number 然后又想不明白,为什么这里能直接访问读写这个指针

stream.codecpar.profile = profile
stream.codecpar.sampleRate = sampleRate
stream.codecpar.chLayout.nbChannels = channelCount

请告诉我,codecpar该怎么解析呢,我想要知道stream的类型

指针访问属性只能在 cheap 这个框架下使用,最终由 cheap 的编译插件将其编译成对应的 js 代码。想在外面访问要么外面的代码也在 cheap 框架下然后用 cheap 编译;要么抛给外层的数据把指针变成结构体实例,结构体实例是一个 Proxy 代理,就可以通过 js 访问里面的属性。

可不可以改进一下getStreams(),把这个指针数据解析完传出Object,不然真的太迷惑了根本无法判断

你是想做什么功能呢,这个开发模式建议将有关的逻辑另起一个项目然后依赖 libmedia 来开发,使用 cheap 来编译,结构体里面的数据有很多枚举类型,直接拿出去也不太好用。

@imzlh
Copy link
Author

imzlh commented Jul 23, 2024

用来判断轨道类型,视频/音频/字幕,便于切换轨道
这个应该挺常用的吧

你说的很有道理,vite虽然可以正常导入libmedia的enum类型但是不能成功打包
我再看看

@zhaohappy
Copy link
Owner

用来判断轨道类型,视频/音频/字幕,便于切换轨道 这个应该挺常用的吧

这个现在还不支持呢,你现在判断了也还是不能切换,现在只能切 hls 和 dash 里面的

@imzlh
Copy link
Author

imzlh commented Jul 23, 2024

用来判断轨道类型,视频/音频/字幕,便于切换轨道 这个应该挺常用的吧

这个现在还不支持呢,你现在判断了也还是不能切换,现在只能切 hls 和 dash 里面的

这样啊...可惜了还以为可以正常使用了,看起来还是该等等
我已经暴露了了type,成功识别了轨道,看起来得再等等

  public getStreams() {
    return this.formatContext.streams.map(item => ({...item,
      type: item.codecpar.codecType
    }));
  }

@imzlh
Copy link
Author

imzlh commented Jul 24, 2024

今天又发现一个问题,随着播放音画不同步越来越大,反复暂停播放也不能解决
视频还是原来那一个(用来测试挺方便的)

  // 开始时间戳超过 10 秒不对齐就不再同步音视频了
  // 这种情况下可视为音频和视频本身就是独立的,各自播放
  if (this.videoDecoder2VideoRenderChannel
    && this.audioDecoder2AudioRenderChannel
    && bigint.abs(videoStartTime - audioStartTime) > 10000n
  ) {
    this.controller.setEnableAudioVideoSync(false)
  }

我觉得应该时间对齐一下,不然音视频错位听着很难受

@zhaohappy
Copy link
Owner

今天又发现一个问题,随着播放音画不同步越来越大,反复暂停播放也不能解决 视频还是原来那一个(用来测试挺方便的)

  // 开始时间戳超过 10 秒不对齐就不再同步音视频了
  // 这种情况下可视为音频和视频本身就是独立的,各自播放
  if (this.videoDecoder2VideoRenderChannel
    && this.audioDecoder2AudioRenderChannel
    && bigint.abs(videoStartTime - audioStartTime) > 10000n
  ) {
    this.controller.setEnableAudioVideoSync(false)
  }

我觉得应该时间对齐一下,不然音视频错位听着很难受

和这里没关系,现在本身就有同步逻辑。出现这种情况是视频解码跟不上了,能支持多线程就支持多线程,优先使用 simd 的解码器。

@imzlh
Copy link
Author

imzlh commented Jul 25, 2024

这个avPlayer是不能复用吗,第二次load()总是报错

Error: [src\avplayer\AVPlayer.ts][line 605] [fatal]: register io task failed, ret: -5, taskId: 456770e6-8060-4089-9d28-6b003cf51c06

@imzlh
Copy link
Author

imzlh commented Jul 25, 2024

今天又发现一个问题,随着播放音画不同步越来越大,反复暂停播放也不能解决 视频还是原来那一个(用来测试挺方便的)

  // 开始时间戳超过 10 秒不对齐就不再同步音视频了
  // 这种情况下可视为音频和视频本身就是独立的,各自播放
  if (this.videoDecoder2VideoRenderChannel
    && this.audioDecoder2AudioRenderChannel
    && bigint.abs(videoStartTime - audioStartTime) > 10000n
  ) {
    this.controller.setEnableAudioVideoSync(false)
  }

我觉得应该时间对齐一下,不然音视频错位听着很难受

和这里没关系,现在本身就有同步逻辑。出现这种情况是视频解码跟不上了,能支持多线程就支持多线程,优先使用 simd 的解码器。

应该不是吧,我看现在已经是8线程解码了,而且seek()后就同步起来了

image

还是建议音视频相差太大时,同步一下

@zhaohappy
Copy link
Owner

这个avPlayer是不能复用吗,第二次load()总是报错

Error: [src\avplayer\AVPlayer.ts][line 605] [fatal]: register io task failed, ret: -5, taskId: 456770e6-8060-4089-9d28-6b003cf51c06

先调 stop 之后才能继续 load

@zhaohappy
Copy link
Owner

今天又发现一个问题,随着播放音画不同步越来越大,反复暂停播放也不能解决 视频还是原来那一个(用来测试挺方便的)

  // 开始时间戳超过 10 秒不对齐就不再同步音视频了
  // 这种情况下可视为音频和视频本身就是独立的,各自播放
  if (this.videoDecoder2VideoRenderChannel
    && this.audioDecoder2AudioRenderChannel
    && bigint.abs(videoStartTime - audioStartTime) > 10000n
  ) {
    this.controller.setEnableAudioVideoSync(false)
  }

我觉得应该时间对齐一下,不然音视频错位听着很难受

和这里没关系,现在本身就有同步逻辑。出现这种情况是视频解码跟不上了,能支持多线程就支持多线程,优先使用 simd 的解码器。

应该不是吧,我看现在已经是8线程解码了,而且seek()后就同步起来了

image 还是建议音视频相差太大时,同步一下

还是你那个 i5-4430 吗,现在 1080p 解码视频用的 2线程,你可以调成 4 线程。
image

@imzlh
Copy link
Author

imzlh commented Jul 25, 2024

这个avPlayer是不能复用吗,第二次load()总是报错
Error: [src\avplayer\AVPlayer.ts][line 605] [fatal]: register io task failed, ret: -5, taskId: 456770e6-8060-4089-9d28-6b003cf51c06

先调 stop 之后才能继续 load

还是报错

image

我的代码:

watch(() => refs.url, async (url, old) => {
    old && await player.stop();
    url && player.load(url);
)});

@zhaohappy
Copy link
Owner

这个avPlayer是不能复用吗,第二次load()总是报错
Error: [src\avplayer\AVPlayer.ts][line 605] [fatal]: register io task failed, ret: -5, taskId: 456770e6-8060-4089-9d28-6b003cf51c06

先调 stop 之后才能继续 load

还是报错

image 我的代码:
watch(() => refs.url, async (url, old) => {
    old && await player.stop();
    url && player.load(url);
)});

这个不影响啥吧

@imzlh
Copy link
Author

imzlh commented Jul 26, 2024

这个avPlayer是不能复用吗,第二次load()总是报错
Error: [src\avplayer\AVPlayer.ts][line 605] [fatal]: register io task failed, ret: -5, taskId: 456770e6-8060-4089-9d28-6b003cf51c06

先调 stop 之后才能继续 load

还是报错
image
我的代码:

watch(() => refs.url, async (url, old) => {
    old && await player.stop();
    url && player.load(url);
)});

这个不影响啥吧

的确...

@imzlh
Copy link
Author

imzlh commented Jul 26, 2024

请问能否添加这几个功能,真的很需要

  • 提取章节(chapter),方便定位时间点
    我知道chapter在EBML比较接近开头的位置,理论上应该能解析出来吧
  • 字幕轨道。我注意到你已经创建 avcodec/subtitle/decoder/*.ts,但是看样子都没有完成
    唯一的WebVTT也只实现了解析而无法渲染,十分可惜
    实在不行可否暴露接口给外部,让外部实现ASS渲染,或者集成libass这样的wasm库呢
  • 切换音视频轨道
    这个我很久就提出过了,本来想自己改一下的,但是...源代码真的太复杂了,看的我头大,无奈只能放弃

@zhaohappy
Copy link
Owner

请问能否添加这几个功能,真的很需要

  • 提取章节(chapter),方便定位时间点
    我知道chapter在EBML比较接近开头的位置,理论上应该能解析出来吧
  • 字幕轨道。我注意到你已经创建 avcodec/subtitle/decoder/*.ts,但是看样子都没有完成
    唯一的WebVTT也只实现了解析而无法渲染,十分可惜
    实在不行可否暴露接口给外部,让外部实现ASS渲染,或者集成libass这样的wasm库呢
  • 切换音视频轨道
    这个我很久就提出过了,本来想自己改一下的,但是...源代码真的太复杂了,看的我头大,无奈只能放弃

这些后面有计划,这个 issues 先关了,太长了,有问题再新建一个吧。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants