Open Predidit opened 2 days ago
@ErBWs @KotaHv
有兴趣测试 macOS/iOS 上的可用性吗
可以,等我把 ohos 的代码保存一下再切换 flutter 版本进行测试
@Predidit 播放看起来没有问题,不过m3u8每个片段都是这样的5s
这个 m3u8 片段是上面提到的 https://yun.366day.site/mp4hls/dmhls/dianwanka1.m3u8 吗
是,只有 macOS 有这个问题,iOS 没有这个问题
来自 kazumi 的其他片段有这一问题吗
如果其他片段也有问题
回滚 https://github.com/Predidit/media-kit/commit/df052555562fb6347c49323847bf7fc3f36f1203 中 macOS 和 iOS 相关修改可以修复吗,以及维持在修改过的 0.64 版本,但使用 full 而不是 default 包可以修复吗
每次更改后除了 flutter clean 外需要清理 pod 缓存
其他片段没有问题,应该和特定 m3u8 有关,这个 m3u8 中分了太多片段
不是,这是一个特殊但被广泛使用的非标准片段,树外补丁本来就是为了修复这一问题
LMM 规则中的电玩咖这个动画所有分集都是这种特殊片段
我一直以为补丁只是为了修复无法把照片格式识别为视频的问题
我去试试
使用 full 完全无法播放,报错
[hls @ 0x1401118e0] Opening 'https://gimg0.baidu.com/gimg/app=2001&n=0&g=0n&fmt=jpeg&src=https%3A%2F%2Fp.ananas.chaoxing.com/star3/origin/b489bc74ee4b3754fb5c75b9659ce289' for reading
[httpproxy @ 0x600000fe8000] Protocol 'httpproxy' not on whitelist 'udp,rtp,tcp,tls,data,file,http,https,crypto'!
[hls @ 0x1401118e0] Failed to open segment 0 of playlist 0
回滚提交仍然播放切片的视频片段
https://github.com/media-kit/media-kit/issues/884 可能与这个 issue 有关
@ErBWs
你觉得上面提到的 Linux 平台 C/C++ 工程的编译问题可能是什么原因呢
这个工程的编译过于繁琐, 且缺乏资料
我几乎没有接触过此类工程,不过我会尝试一下
使用 apt 安装 x264/x265 ,然后动态链接到系统库是可以编译出产物的。
仓库里唯一的release就是这样得到的。但是这样的 libmpv.so 在没有安装特定 libx264/libx265 版本的设备上会无法使用。所以需要考虑静态链接。
测试可以直接下载 github actions 里的 output 。里面的 mpv 直接依赖同目录下一并编译的 libmpv.so。直接运行 mpv 就可以看到结果。它能在没有安装 libx264 的linux设备上成功启动的话就完成了。
或者使用 ldd 命令可以查看 libmpv.so 的链接情况。
external 中的脚本除了 ffmpeg-config 外没有修改过,修改的地方主要是为了让 pkg-config 找到额外引入的 /dep 目录下的静态库。
我尝试用 --extra-ldflags="${GITHUB_WORKSPACE}/dep/linux_amd64/lib/libx264.a ${GITHUB_WORKSPACE}/dep/linux_amd64/lib/libx265.a"
且不加 --enable-libx264 --enable-libx265
成功编译出产物了,不过我没有现成的 Linux 测试环境,不知道这样是否正确链接上了。
另外我看到有 arm64 和 amd64 的不同静态库,不知道是否需要或者在哪里做区分
理论上这样无效。
无论是否使用哪种方法进行链接,都需要 --enable-libx264 --enable-libx265
显式启用对应支持
如果显示启动对应支持后还能编译出产物,那基本上是没有问题的
不过我不认为启用后可以过编译,编译脚本在这种情况下应该不知道去哪里寻找 libx265 的头文件
现在没有做区分,硬编码在使用 amd64
位置在 ffmpeg-config 脚本中,设置 PKG_CONFIG_PATH 到 amd64 的目录
启用后确实无法过编译
@Predidit macOS 片段播放的问题解决了,需要增加一个 mpv 的命令行参数:https://github.com/mpv-player/mpv/issues/6928
另外我基本可以确定 macOS 和 iOS 不需要补丁就可以播放非标视频流
if (player.platform is NativePlayer) {
await (player.platform as dynamic).setProperty('stream-lavf-o-append', 'protocol_whitelist=file,http,https,tcp,tls,crypto,hls,applehttp');
}
太棒了。
无补丁播放非标视频流应该是 darwin-build 脚本中没有启用 gif&png 这些图片格式的解码支持,所以 ffmpeg 回落到正常的视频解码。
我也解决了 linux 平台上的最后的链接问题,现在 linux 上的 media_kit_test 已经可以在没有 mpv 包的系统上编译与调试,视频播放测试也成功通过。
唯一阻止我们关闭 #429 的问题大概只剩下了 libmpv.so 的静态编译,我们可以不依赖 libx264/libx265 而是启用 gpl 组件运行解码。这一定程度上解决了问题。
但是 libmpv.so 仍然依赖大量乱起八糟的外部库,这些都没有实现静态链接,例如 libsndio.so
这导致 libmpv.so 目前需要额外在系统上安装大量的包才能正常工作,我准备翻一翻 mpv-build 脚本的分支碰碰运气,看看有没有其他人已经做过这些工作。
实际上我并没有在 libmpv-darwin-build/scripts/ffmpeg/meson.build 中观察到关闭图片解码,反而是全部打开
不过如果可以通过 ffmpeg 的配置来关闭图片解码,让视频流正常播放,那是否可能如 media_kit 的 README 中所写那样,使用 flatpak 来解决 libmpv 的链接问题?
macOS 在我这可以正常播放,没有遇到片段问题。
ffmpeg 禁用图片解码只能在编译时进行,具体可以参考我 fork 的 avbuild 那个仓库
flatpak 打包的运行环境是几个可选的公共运行环境,我们需要补丁后的 libmpv
linux 直接 apt 安装 mpv 是播放不了上面的示例链接的,但当前的 media_kit_test 可以
macOS 在我这可以正常播放,没有遇到片段问题。
变成玄学问题了,我现在也不会出现片段问题
我想我们需要一些资深 Linux 用户的帮助
@first-storm @pugaizai
你们怎么看 https://github.com/Predidit/libmpv-linux-build/actions/runs/12136318086/artifacts/2266188246 这个包中的 libmpv.so 的依赖关系,静态编译所有依赖是不可能的,我们编译哪些依赖比较好。
但是 libmpv.so 仍然依赖大量乱起八糟的外部库,这些都没有实现静态链接,例如 libsndio.so
我编译的libmpv似乎没libsndio.so这种依赖
参考以前用flatpak打包过的逍遥橙子老师的simplelive
我想我们需要一些资深 Linux 用户的帮助
@first-storm @pugaizai
你们怎么看 https://github.com/Predidit/libmpv-linux-build/actions/runs/12136318086/artifacts/2266188246 这个包中的 libmpv.so 的依赖关系,静态编译所有依赖是不可能的,我们编译哪些依赖比较好。
我也不是很熟悉这些,我也不清楚到底定制了哪些东西,所以可能不能提供很大帮助。但在我的电脑上(我的电脑没有安装mpv和vlc,只有基本的解码器。)libsixel.so.1、libsndio.so.7、libXpresent.so.1是缺失的。但这三个都可以通过包管理器解决,所以我认为可以直接写进依赖里让包管理器解决。播放上面的片段也没问题。都使用的是openSUSE发行版官方打包的库。也就是说应该定制只在mpv本身。这些缺失的库都可以通过包管理器解决,我不认为所有都打包进tarball是个好主意。
在Flatpak的GNOME运行时里,有更多依赖是缺失的,但这些应该可以通过更改Flatpak的Manifest解决:
[📦 org.gnome.Platform]$ ldd ./libmpv.so | grep 'not found'
libbz2.so.1.0 => not found
libbluray.so.2 => not found
librubberband.so.2 => not found
libuchardet.so.0 => not found
libsndio.so.7 => not found
libcaca.so.0 => not found
libjpeg.so.8 => not found
libsixel.so.1 => not found
libXpresent.so.1 => not found
[📦 org.gnome.Platform]$
顺带一提,org.freedesktop.Platform也是一样的结果
但是 libmpv.so 仍然依赖大量乱起八糟的外部库,这些都没有实现静态链接,例如 libsndio.so
我编译的libmpv似乎没libsndio.so这种依赖
参考以前用flatpak打包过的逍遥橙子老师的simplelive
我这里的也没有,我猜是由于定制导致的。
橙子大佬没有使用自定义 libmpv 库,橙子大佬的程序编译时也是直接从 pkg-config 进行的链接。
橙子大佬的程序依赖系统库,只要系统安装了 mpv 就可以了,直接依赖系统的 libmpv.so。至于系统 mpv 依赖什么其他的库不在橙子大佬的考虑范围内。这些在包管理器安装 mpv 的时候都被解决了。
因为我们要应用一个重要的树外补丁,所以我们需要引入一个定制的 libmpv.so 就是上面示例链接里包含的东西。
在这种情况下,libmpv.so 被直接集成了,不再依赖系统,但是这样我们要自行处理 libmpv.so 的下层依赖关系。
@first-storm
谢谢你,你给出的 gnome runtime 中确实7个依赖我觉得很棒,我们可以考虑只解决这7个依赖,应该可以应付大部分情况
libmpv的下层依赖不是能自己在系统里找吗?
@pugaizai
是的,在 AUR 仓库的构建脚本也能找到,但是太多了,几十个依赖是静态编译不完的
还有 libdrm 这种重量级
libmpv的下层依赖不是能自己在系统里找吗?
其实我觉得这样,deb包打包可以直接debian里去抄libmpv的依赖了,再加个libsndio。tar包那里就不需要考虑了,因为tarball本来就不用搞全依赖。
编译选项不一样,依赖也不一样,和deb包的依赖应该有出入,上面那7个应该差不多了
直接抄再加 libsndio 应该也行,不过我想先看看静态编译 librubberband 和 libsndio 的可行性
librubberband 在 arch 上直接用包管理器解决不了问题,似乎是自身的版本问题,需要建立一个新版本到老版本的符号链接,能静态编译就没那么多破事了
macOS 在我这可以正常播放,没有遇到片段问题。
@KotaHv 不知道你那边是什么表现,我现在发现用 Xcode 编译时长一直是正常的,用 IDEA 编译一直是不正常的,之前发现没有问题正好是开了全局代理 IDEA 无法连接到程序因此尝试用 Xcode 编译而认为问题解决了
编译选项不一样,依赖也不一样,和deb包的依赖应该有出入,上面那7个应该差不多了
直接抄再加 libsndio 应该也行,不过我想先看看静态编译 librubberband 和 libsndio 的可行性
librubberband 在 arch 上直接用包管理器解决不了问题,似乎是自身的版本问题,需要建立一个新版本到老版本的符号链接,能静态编译就没那么多破事了
你不要考虑specific发行版的问题,那是用户该考虑的,你又没有说支持ArchLinux,这样的话问题就该是AUR打包者的了。如果非要钻牛角尖,你会发现在类似VoidLinux这样的发行版上连glibc都不存在。
@pugaizai @first-storm
抄 mpv deb 包的依赖会给 flatpak 的构建带来大麻烦吗
librubberband 在 arch 上直接用包管理器解决不了问题,似乎是自身的版本问题,需要建立一个新版本到老版本的符号链接,能静态编译就没那么多破事了
这种东西在 DEBIAN/postinst 里多写行命令就行了。我觉得是只要个libmpv.so就行了,没必要搞别的。
另外因为github action用的是 ubuntu 2204,用的系统库太旧了所以你在arch上会有这种问题
@pugaizai @first-storm
抄 mpv deb 包的依赖会给 flatpak 的构建带来大麻烦吗
不会,因为flatpak打包不是靠deb写的依赖来的。但是你这次不能直接merge flathub bot的合并请求了,因为这次依赖变了要改manifest。
@pugaizai
你的意思是依赖直接写libmpv本身,让apt自动解决吗。
@pugaizai
你的意思是依赖直接写libmpv本身,让apt自动解决吗。
这样不行,ffmpeg 静态链接到了 mpv 补丁在 ffmpeg 中,我们的依赖包含 fffmpeg 的依赖,例如 libsndio 所以事情很麻烦
macOS 在我这可以正常播放,没有遇到片段问题。
@KotaHv 不知道你那边是什么表现,我现在发现用 Xcode 编译时长一直是正常的,用 IDEA 编译一直是不正常的,之前发现没有问题正好是开了全局代理 IDEA 无法连接到程序因此尝试用 Xcode 编译而认为问题解决了
我刚刚使用IDEA 进行编译,没有出现片段播放的问题。
我刚刚使用IDEA 进行编译,没有出现片段播放的问题。
那就不清楚了,现在 media_kit 仓库也有相关 issue 打开并且开发人员注意到了这个问题,希望他们能找到解决办法吧
close #426 #353 #290
概况
从 fvp 迁移到 media_kit
我们需要来自 fvp 的 ffmpeg树外补丁 来实现非标准视频流的播放 (eg: https://yun.366day.site/mp4hls/dmhls/dianwanka1.m3u8)
我们需要维护自己的 media_kit 分支,以使动态链接库下载地址指向我们维护的包含以上树外补丁仓库
工作分支
media_kit windows平台动态链接库 android平台动态链接库 macOS/iOS动态链接库 linux平台动态链接库
测试方法
克隆完整的 media_kit分支,在 media_kit_test 目录下运行 main.dart 进行测试
进度
windows
完成
Android
完成
macOS/iOS
完成,需要添加额外 mpv 参数
Linux
media_kit 现在链接外部 libmpv.so 而不是使用系统 libmpv.so 经过测试视频播放正常
当前主要问题是 libmpv.so 的下层依赖,当前依赖可以参考 mpv deb 包
在 flatpak Gnome Runtime 上缺失
我们希望将这九个缺乏的依赖尽可能静态链接