还是之前那个问题,我希望在项目中用 FFMpeg 的函数,例如 avformat_open_input, avformat_find_stream_info 等等;但之前那个问题我提的解决方案感觉很有问题,编译能通过,但后期会遇到各种奇奇怪怪的问题,包括 avformat_open_input 的时候出现 Error opening file: Protocol not found,返回值为 -1330794744 等等,因此我新开一个问题来问一下。
我感觉还是应该编译 //third_party/FFMpeg 的源码,按照老师上一次的回答应该是 gn gen 的时候加上参数 “is_component_ffmpeg=true”;包括我也查了各种资料,加上了 “proprietary_codecs=true”, “rtc_use_h264=true” 和 “ffmpeg_branding=“Chrome”” 等,都没什么用,虽然在编译时已经能够加载到 //third_party/ffmpeg 里面的文件了(我看了 ffmpeg_generated.gni,确实没有swscale 部分内容,但这只是小问题,手动加上就行了),但编译出来的静态库和共享库(.a 和 .so 文件)仍然不能放到当前的 sysroot 里面去,在我的系统环境中就是:
/home/ubuntu/Desktop/WebRTC/src/build/linux/debian_bullseye_amd64-sysroot/usr/lib/x86_64-linux-gnu
这个环境下;甚至我感觉它都没编译出来静态库 / 共享库,这导致运行的时候用的是上面路径默认的陈年库文件。
根据我对版本的观察,似乎 gclient sync 的时候会下载最新版本的 FFMpeg,具体版本为 n6.1.x,但 sysroot 路径下的 .so 文件却是 n5.9.3 版本的,以下是我用 nm 判断的结果:
sysroot 下:
ubuntu@ubuntu-virtual-machine:~/Desktop/WebRTC/src/build/linux/debian_bullseye_amd64-sysroot/usr/lib/x86_64-linux-gnu$ nm -D libavformat.so.59.27.100 | grep avformat_open_input
00000000000928d0 T avformat_open_input@@LIBAVFORMAT_59
//third_party/ffmpeg 手动编译(直接在 third_party/ffmpeg 里面 Make)得到的库文件
ubuntu@ubuntu-virtual-machine:~/Desktop/ffmpeg/out/lib$ nm -D libavformat.so.61.6.100 | grep avformat_open_input
0000000000086ce0 T avformat_open_input@@LIBAVFORMAT_61
很明显,它们的大版本是不同的,我认为这是它运行 avformat_open_input 出错并返回 -1330794744 的核心问题。
我想问一下超哥,之前有没有遇到在 WebRTC 中使用 FFmpeg 的情况,具体编译方法是怎么样的(需要在 gn gen 时候加哪些参数,我加的是否正确)?以及以超哥的经验来判断,avformat_open_input 出错并返回 -1330794744 的原因是否是 #include 的头文件和 动态库文件(.so)的版本不同导致的?