最近看了关于手机投屏的功能,本来打算跑个miracast的demo玩玩,奈何电脑网卡不支持wifi direct,网上搜索发现有个开源的库scrcpy可以实现有线投屏,scrcpy项目github地址。
安装方式可以选择apt的方式,也可以选择源码编译。我选择了源码编译,其中遇到了不少问题,现在记录一下。
1 编译安装步骤
1 下载源码
git clone https://github.com/Genymobile/scrcpy
cd scrcpy
./install_release.sh
2 安装依赖
该项目依赖ffmpeg与SDL2,安装方法可以参考其他博客,该项目的github里也有相关说明。
3 meson build
执行meson build脚步,需要提前安装meson。
meson x --buildtype release --strip -Db_lto=true
执行这一步的时候出现了Dependency "libavformat"not found的错误,出错的地方是app/meson.build文件,是因为编译是找不到ffmpeg的库。
修改app/meson.build文件中添加ffmpeg的地方,将依赖路径改为本机ffmpeg的安装地址,位置大概在47行。
修改前:
if not get_option('crossbuild_windows')
# native build
ffmpeg_dir = '/usr/local/ffmpeg/lib'
SDL_dir = '/usr/include/SDL/lib'
dependencies = [
dependency('libavformat'),
dependency('libavcodec'),
dependency('libavutil'),
dependency('sdl2'),
]
if v4l2_support
dependencies += dependency('libavdevice')
endif
else
修改后:
if not get_option('crossbuild_windows')
# native build
ffmpeg_dir = '/usr/local/ffmpeg/lib'
SDL_dir = '/usr/include/SDL/lib'
dependencies = [
#dependency('libavformat'),
#dependency('libavcodec'),
#dependency('libavutil'),
#dependency('sdl2'),
cc.find_library('libavformat', dirs: ffmpeg_dir),
cc.find_library('libavcodec', dirs: ffmpeg_dir),
cc.find_library('libavutil', dirs: ffmpeg_dir),
cc.find_library('SDL2', dirs: SDL_dir),
]
if v4l2_support
#dependencies += dependency('libavdevice')
dependencies += [cc.find_library('libavdevice', dirs: ffmpeg_dir)]
endif
else
修改后执行又报了libavformat头文件找不到的错误。
同样修改app/meson.build文件,位置大约在148行,修改后:
src_dir = [
include_directories('/usr/local/ffmpeg/include/'),
include_directories('src')
]
这下meson build就可以执行过去了。
4 编译
执行以下命令:
ninja -Cx
njnja 相当于 make, 所以上面会编译代码。编译后出现了scrcpy-server编译不过的问题。
原因是没有安装android SDK,安装方法参考这篇博客。
安装后执行:
export ANDROID_SDK_ROOT=/usr/local/android-sdk/android-sdk-linux/
需要替换为自己的SDK安装路径。
安装后执行ninja -Cx仍出现Failed to install the following Android SDK packages as some licences have not been accepted.错误。
解决方法:
android list sdk --all
android update sdk -u --all --filter 1,2,3,5,11,12,22,23,24,25,26,27,28,29,88,89
android update sdk --no-ui --filter build-tools-24.0.0,android-24,extra-android-m2repository
cd 到android SDK安装目录
/android-sdk-linux/tools/bin
执行:
sudo ./sdkmanager --update
有可能因JDK版本过高而出现Exception in thread “main” java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema错误。
我的电脑里默认安装了java11,查看版本方式:
java -version
解决方案,安装JDK8,将java默认版本设置为8。
安装JDK8:
sudo apt-get update
sudo apt-get install openjdk-8-jdk
切换默认JDK:
sudo update-alternatives --config java
输出对应序号即可切换。
至此编译遇到的所有问题得以解决,顺利编译成功。
2 执行效果
编译好后用usb连上手机,打开usb调试功能,注意要是安卓手机才可以,执行
./run x
效果如下:
效果挺不错,而且还可以在电脑上用鼠标操作手机,很强大,具体一些好玩的命令参考项目github网站,后期打算看一看项目源码。