遇到了一个 tumbleweed 下 mpv 无法播放 samba 共享的问题

更新之后,mpv 无法远程打开 samba 网络共享中的视频文件。
命令行下面运行出现这样的报错:

$ mpv smb://admin@192.168.0.100/share/movie/1.mp4
[ffmpeg] Protocol not found. Make sure ffmpeg/Libav is compiled with networking support.
Failed to open smb://admin@192.168.0.100/share/movie/1.mp4.

尝试安装 Packman 中的 ffmpeg/libav 包,未果。

在 opensuse 英文论坛上看到一个人和我遇到的问题是一样的:
https://forums.opensuse.org/showthread.php/539418-tumbleweed-update-no-longer-can-play-videos-from-smb-share

说明 mpv 不支持 smb 协议。

在一次系统升级之前是可以播放的。@hillwood

更新:在最近的一次更改中,mpv 改为了要求 ffmpeg 支持才能播放网络视频:

但是为什么 Packman 编译的 ffmpeg 不支持 samba 播放目前还在研究中。

查到了,ffmpeg 需要开启一个编译选项"–enable-libsmbclient" 来打开 smb 支持,但是目前 Packman 的编译并没有打开这个。需要修改 Packman 的编译脚本来让 ffmpeg 支持 samba。

看起来像是这个原来是 MPV 的功能,后来 FFMPEG 有了这个功能,MPV 就不自己提供这个功能了,但是 Packman 编译的 FFMPEG 又没有启用这个功能。。。

对,不知道什么时候 Packman 才能修复编译选项

我在 PMBS 和 OBS 都提交了 Request:

https://build.opensuse.org/request/show/785258

obs 上提交就够了。packman 上也是链接的 obs 。

似乎还没有修复,有 follow-up 吗?

要等 OBS 进了 Factory ,Packman 才会更新吧

似乎还没解决啊,不知道卡在哪里了

已经进了 OBS Factory 了。Packman 那边拒绝了我的 Request,我也不知道他们怎么个流程。

后来他们把那个 Request 给 Revert 了。你还是去提 Bugzilla 吧,我已经管不了了。

悲剧……我在邮件列表里面问了,他们说 working on it,只能再等等了。

交的修复被打回来了,说 libsambaconf.so 和 mariadb 有符号冲突:
https://build.opensuse.org/request/show/790242
为什么会和其他不同的 so 文件有符号冲突??

09:54 < fvogt> libmariadbd.so.19 and libsmbconf.so.0 both define a symbol get_charset

这两个库都提供了 public function get_charset ()。

linking 的顺序可能导致了用了 libmariadbd.so 里内容和作用完全不同的同名 public 函数。

由于上述两个 so 都不是 ffmpeg 自带的,我感觉你应该从调整 linking 顺序下手。

https://holtstrom.com/michael/blog/post/437/Shared-Library-Symbol-Conflicts-(on-Linux).html

所以说只能向 samba 或者 mariadb 提交补丁,让它们修改其中之一的函数名字了?但是这样修改的话,所有依赖于这个名字的应用也要修改。看来还是向 Samba 提交比较好……

感觉这样完全 screw up 了啊,本质是要求所有项目的开发者发布的 so 库 export 名字全部不能冲突。开源项目那么多,怎么可能做到不用重复的名字呢?比如说像这个 mariadb 和 samba,是完全不一样的项目,却 “不约而同” 地采用了同一个函数名字 get_charset 并且把它们 export 到了 so 里面。我查了一下,这个也不是最近才发生的冲突,而是早就存在的。这样应该怎么说服双方解决呢?

linking 的顺序意思是指编译时:

gcc -lmariadbd -lsambaconf 

就会用 libmariadbd.so 里的 get_charset ()

gcc -lsambaconf -lmariadbd 

就会用 libsambaconf.so 里的。

我没看 ffmpeg 的 buildlog,也不知道 ffmpeg 是否依赖 mariadb…不太懂 C,感觉是两个都依赖,linking 的顺序不对,导致用了前一个。你可以给 ffmpeg 提 issue 让它们自己改的