最近看了关于手机投屏的功能,本来打算跑个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的库。

Android读取自动模式下的屏幕亮度 android 读屏_ci


修改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头文件找不到的错误。

Android读取自动模式下的屏幕亮度 android 读屏_android_02

同样修改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读取自动模式下的屏幕亮度 android 读屏_java_03


原因是没有安装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读取自动模式下的屏幕亮度 android 读屏_ci_04

解决方法:

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错误。

Android读取自动模式下的屏幕亮度 android 读屏_ci_05

我的电脑里默认安装了java11,查看版本方式:

java -version

解决方案,安装JDK8,将java默认版本设置为8。
安装JDK8:

sudo apt-get update
sudo apt-get install openjdk-8-jdk

切换默认JDK:

sudo update-alternatives --config java

输出对应序号即可切换。

至此编译遇到的所有问题得以解决,顺利编译成功。

Android读取自动模式下的屏幕亮度 android 读屏_android_06

2 执行效果

编译好后用usb连上手机,打开usb调试功能,注意要是安卓手机才可以,执行

./run x

效果如下:

Android读取自动模式下的屏幕亮度 android 读屏_android_07

效果挺不错,而且还可以在电脑上用鼠标操作手机,很强大,具体一些好玩的命令参考项目github网站,后期打算看一看项目源码。