CH9338应用:开源项目FFMPEG实现镜像屏及拓展屏
项目背景
最近由于程序调试,需要在两台电脑间需要频繁拷贝文件,拿着U盘每天在两台电脑之间插拔几十次,实在是苦不堪言,于是某宝买了一个USB KMFU对拷线,文件传输只需拖拽鼠标,拷贝速度能有20多MB/s ,完全满足日常所需。 甚至可以在KMFU对拷线自身的HUB上插一个固态硬盘,超大文件传输至固态硬盘后,通过KMFU配置界面将固态硬盘切换到对端电脑上,极为方便!
研究了下该设备,发现可以搭配FFMPEG项目做一些有趣的事情,于是开始了尝试的第一步。
该项目硬件可直接在淘宝搜索KMFU购买。
KMFU键鼠触摸板共享 数据文件对拷 USB外设共享器HUB
CH9338简介
CH9338是一款用于实现高速USB对拷功能的专用芯片,由CH9338打造的USB KMFU (Keyboard/Mouse/File/USB HUB)对拷共享HUB可用于多台计算机键盘/鼠标/触摸板的跨屏共享,支持Windows、macOS、Android操作系统。
PC间跨屏使用时等同单台PC内操作,省去鼠标键盘、节省空间,同时两台PC间的剪贴板、文件支持共享。
USB KMFU 还提供USB HUB和外设共享功能,无需用户插拔USB设备,实现在两台PC设备间的3个HUB端口自由切换,便捷的同时延长了USB接口的使用寿命。

与传统的USB对拷线相比,KMFU有很多创新,例如:
边界防误穿屏:鼠标穿屏灵敏度6挡可调。
灵敏度高----->鼠标切屏丝滑无阻力
灵敏度低----->鼠标切屏有阻力,减少误操作

外设共享:KMFU自带HUB上USB设备,可随时切换至任意一端。

数据透传通道:提供一条USB数据透传通道。 本次博客主要是利用CH9338的USB数据透传通道,借助FFMPEG项目传输屏幕数据,实现镜像屏及拓展屏功能。 CH9338详细介绍可参考:
项目最终效果
镜像屏:

拓展屏:

FFMPEG简介
FFmpeg是一款开源的跨平台音视频处理工具集,提供录制、转换、流传输等完整解决方案。其核心库包括libavcodec(编解码)、libavformat(封装格式处理)、libavfilter(滤镜处理)等等。 用户可通过项目内置的ffmpeg、ffplay程序快速实现基础功能,也可通过API实现复杂自定义功能。

应用场景
可以利用CH9338提供的透传通道,搭配FFMPEG去实现屏幕的镜像与拓展。
屏幕镜像
屏幕镜像的本质是通过gdigrab去抓取屏幕、通过CH9338发送H264数据、另一台PC中使用ffplay.exe解码并播放画面。 ffmpeg.exe抓屏并传输:
ffmpeg
-probesize 32
-fflags flush_packets
-fflags discardcorrupt
-flags low_delay
-analyzeduration 0
-f gdigrab
-framerate 30 #指定30帧录制传输 -i desktop
-preset ultrafast #指定ultrafast编码预设
-c:v libx264 #指定libx264编码
-crf 28 #H264恒定速率因子,数值越小,画质越高 -g 1
-tune zerolatency
-pix_fmt yuv420p
-max_delay 0
-bf 0 #取消B帧,减小延迟 -f h264
"ch375://download" #声明传输协议
ffplay.exe接收并实时显示:
ffplay
-fflags nobuffer
-analyzeduration 0
-probesize 32
-flags low_delay
-flags2 fast
-fflags discardcorrupt
"ch375://upload"
屏幕拓展
创建虚拟显示屏
首先需要一个虚拟显示驱动来创建副屏。 这里推荐借助parsec-vdd项目来完成。 Parsec VDD 可在 Windows 10+ 系统上启用虚拟显示,能够很方便的创建各种自定义尺寸的屏幕。 项目仓库:

2.ffmpeg.exe抓屏并传输
ffmpeg
-probesize 32
-fflags flush_packets
-fflags discardcorrupt
-flags low_delay
-analyzeduration 0
-f gdigrab
-framerate 30
-offset_x 1920 #主屏幕尺寸为19201080,因此抓取x坐标偏移1920 -offset_y 0
-video_size 1920x1080 #创建的副屏尺寸为19201080 -i desktop
-preset ultrafast
-c:v libx264
-crf 28
-g 1
-tune zerolatency
-pix_fmt yuv420p
-max_delay 0
-bf 0
-f h264
"ch375://download"
ffplay.exe接收并实时显示命令不变,仍是:
ffplay
-fflags nobuffer
-analyzeduration 0
-probesize 32
-flags low_delay
-flags2 fast
-fflags discardcorrupt
"ch375://upload"
总结
项目所使用的WCHKMFU相关库文件可联系官方技术支持索取:
本文利用CH9338芯片提供的USB透传通道完成屏幕数据的传输。修改的FFMPEG的源码、编译后的ffmpeg.exe、ffplay.exe,以及通过FFMPEG API调用CH9338抓屏推流及拉流DEMO均已上传至Github,详见:
