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

Feature Request: 对未知长度音频的支持 #46

Open
Yesterday17 opened this issue Nov 30, 2021 · 8 comments
Open

Feature Request: 对未知长度音频的支持 #46

Yesterday17 opened this issue Nov 30, 2021 · 8 comments

Comments

@Yesterday17
Copy link

Yesterday17 commented Nov 30, 2021

目前如果无法正常解析音频长度,获取到的 duration 就会是 NaN

当音频是以流的形式呈现时,chrome 就不能正常获取音频长度了。Firefox 会边加载边更新音频长度,但 chrome 不会,会一直保持 NaN,即音频长度不可用。

某种解决方法是通过 MediaSource 替代音频直链,通过 fetch 获取音频内容,同时在音频流完全加载完毕时将 duration 写入。如果希望的话,还可以通过 ServiceWorkerfetch 结果缓存。个人实现方式如下:

https://github.com/ProjectAnni/anni-embed-player/blob/747014c8c832cbf2702604b074e79e67db949502/player.js#L26-L59

当然,也可以选择不支持,但希望在进度条处有正确的提示,而非当前的 Infinity/NaN

@magic-akari
Copy link
Owner

使用 fetch 获取外部数据会遇到跨域问题。而如今网络上的绝大部分音频直链都不会设置一个允许所有域名的跨域白名单。所以通过 fetchMediaSource 组合来完成的工作很容易会出现问题。

不过我很好奇,音频流是什么样子的,如何确定起点之类的问题。如果方便可以提供一个链接 sample

@Yesterday17
Copy link
Author

啊,忘了跨域这回事了。个人项目的协议定义是允许跨域的,忘了这一茬。

音频地址是 https://annil.mmf.moe/LACM-14961/1?auth=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE2MzIzMjYwMTAsInR5cGUiOiJzaGFyZSIsInVzZXJuYW1lIjoiWWVzdGVyZGF5MTciLCJhdWRpb3MiOnsiTEFDTS0xNDk2MSI6WzFdfX0.-7J9Hb70qe-oy4ZpNmjbuzC4fgNDuv7w4ww50utZ6DY

可以在这个链接观察使用 MediaSource 的效果预览。

因为是服务器 ffmpeg 实时转码的,因此没有确定的音频长度(需要 seek,显然没有这个能力)。

转码部分的源码在此

@magic-akari
Copy link
Owner

我试了一下,确实获取不到长度信息。 Chrome 在播放完之前,获取到的长度信息都是 Infinity,而 NaN 实际上是我计算出来的错误结果。而播放结束后才获取完整的长度,但是这个时候长度可能已经没什么用了。
这个可以特殊处理一下,比如隐藏。但是还有个更大的问题:如何绘制进度条
我切回了浏览器原始外观的播放器,发现他的进度条也很“随缘”。

@magic-akari
Copy link
Owner

另外,你们的项目很有意思,我很感兴趣。

@Yesterday17
Copy link
Author

Yesterday17 commented Nov 30, 2021 via email

@Yesterday17
Copy link
Author

Yesterday17 commented Nov 30, 2021 via email

@magic-akari
Copy link
Owner

-movflags faststart 这样的 ffmpeg 参数能使用吗?

@Yesterday17
Copy link
Author

Yesterday17 commented Nov 30, 2021

之前有试过,之所以转成 adts 而不是能带元数据的 mp4(m4a) 就是因为输出 mp4 必须要能 seekfaststart 虽然可以生成但是播放器完全解析不了(报大量错)

我在想 -t 指定长度能不能让 ffmpeg 先把 duration 写进去,但只是想法,之后可以尝试一下

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

2 participants