# 基于rk3568的网络摄像头drm显示模块 **Repository Path**: hotcancer0716/LinkTel ## Basic Information - **Project Name**: 基于rk3568的网络摄像头drm显示模块 - **Description**: 基于rk3568的网络摄像头drm显示模块,命名LinkTel是因为link代表网络,Tel代表它的原始作用是视频通话的感觉,所以叫Tel,整合在一起代表实现各类进行视频通信的场景。 - **Primary Language**: C - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-01-09 - **Last Updated**: 2026-01-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 基于rk3568的网络摄像头drm显示模块 #### 介绍 基于rk3568的网络摄像头drm显示模块,命名LinkTel是因为link代表网络,Tel代表它的原始作用是视频通话的感觉,所以叫Tel,整合在一起代表实现各类进行视频通信的场景。 #### 软件架构 软件架构说明 python端: UDP_video_Service 是电脑做为摄像头采集,主动发送方 UDP_video_Client 用于调试,验证摄像头是否成功采集并发送, Ubuntu端: network_test.c 测试和UDP_video_Service能否实现通信连接 save_frames_only.c 测试数据传输和图像编码解码的准确性 final_receiver_with_current.c 在Ubuntu端完成通信连接,图像编码,和图片文件存储 simple_player.sh 因为Ubuntu自带eog图片显示器,写个脚本自动播放变化的图片 嵌入式Linux端: 注意以下代码全都是交叉编译,交叉编译工具需要用的gst,libjpeg,lm等,使用百度云盘的3568专用交叉编译器才能顺利编译。 network_test.c 测试嵌入式端的网络,是否跟服务器进行连通。 fb_test.c 测试当前设备的显示屏参数 list_planes.c 列出基于DRM机制的显示屏参数 list_crtcs.c 列出基于DRM机制的显示屏高级参数 drm_color.c 基于DRM机制控制液晶屏 color_cycle.c 基于DRM机制循环显示液晶屏 save_frames_only.c 和python服务端的代码通信,把每帧图像下载成文件保存在当前目录下 play_images_drm.c 基于DRM机制循环播放当前目录下已下载的图片文件 show_image.c 选择一张指定的图片,可选择全屏显示,或全尺寸显示 play_movie.c 基于gst播放指定的视频文件,可选择全屏显示,或全尺寸显示 最终程序: save_frames_only_one.c 和python服务端的代码通信,把每帧图像下载成文件保存在当前目录下,但只保存一张名为frame.jpg的图片,反复更新。 LinkTel.c 只要检测到frame.jpg文件有更新,就显示,最终实现类似视频播放一样的效果。 #### 安装教程 1. 嵌入式Linux连接wifi 需要用到wpa_supplicant命令,/usr/sbin/wpa_supplicant 。 在/etc/目录下,有个wpa_supplicant.conf文件:ls -l /etc/wpa_supplicant.conf root@RK356X:/etc# cat /etc/wpa_supplicant.conf ctrl_interface=/var/run/wpa_supplicant ap_scan=1 network={ ssid="txnb" psk="txnb123.." key_mgmt=WPA-PSK priority=1 } # 启动wpa_supplicant wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant.conf -D nl80211 root@RK356X:/etc# ifconfig lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:372 errors:0 dropped:0 overruns:0 frame:0 TX packets:372 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:22768 (22.2 KiB) TX bytes:22768 (22.2 KiB) p2p0 Link encap:Ethernet HWaddr 16:F5:F9:F7:78:12 UP BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) wlan0 Link encap:Ethernet HWaddr 14:F5:F9:F7:78:12 inet addr:192.168.1.177 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::ad88:4ca1:be92:866e/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:11 errors:0 dropped:0 overruns:0 frame:0 TX packets:27 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:1950 (1.9 KiB) TX bytes:3403 (3.3 KiB) # 获取IP地址(使用DHCP) dhclient wlan0 # 或者使用udhcpc udhcpc -i wlan0 # 查看IP地址 ip addr show wlan0 root@RK356X:/etc# ip addr show wlan0 3: wlan0: mtu 1500 qdisc mq state UP group default qlen 1000 link/ether 14:f5:f9:f7:78:12 brd ff:ff:ff:ff:ff:ff inet 192.168.1.177/24 brd 192.168.1.255 scope global wlan0 valid_lft forever preferred_lft forever inet6 fe80::ad88:4ca1:be92:866e/64 scope link valid_lft forever preferred_lft forever =================================================================================================== # 查看路由 ip route root@RK356X:/etc# ip route default via 192.168.1.1 dev wlan0 src 192.168.1.177 metric 303 192.168.1.0/24 dev wlan0 proto kernel scope link src 192.168.1.177 metric 303 =================================================================================================== ping -c 3 192.168.1.182 #测试连接服务器ip root@RK356X:/etc# ping -c 3 192.168.1.182 PING 192.168.1.182 (192.168.1.182) 56(84) bytes of data. 64 bytes from 192.168.1.182: icmp_seq=1 ttl=64 time=8.87 ms 64 bytes from 192.168.1.182: icmp_seq=2 ttl=64 time=24.9 ms 64 bytes from 192.168.1.182: icmp_seq=3 ttl=64 time=44.8 ms --- 192.168.1.182 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2004ms rtt min/avg/max/mdev = 8.869/26.160/44.754/14.678 ms 2. 几个特殊的交叉编译命令 假设 : 交叉编译器路径 = /home/stu/gec-rk3568-linux/prebuilts/gcc/linux-x86/aarch64/ 编译时: 交叉编译器路径/aarch64-rk3568-linux-gnu/bin/aarch64-linux-gcc drm_color.c -o drm_color -ldrm 交叉编译show_image.c时注意编译时要带libjpg库-ljpeg, ~/gec-rk3568-linux/prebuilts/gcc/linux-x86/aarch64/aarch64-rk3568-linux-gnu/bin/aarch64-linux-gcc show_image.c -o show_image -ljpeg -ldrm 交叉编译视频播放时,需要引用gst/gst.h和gstreamer-1.0.pc,可以使用find命令搜索确认交叉编译环境里有没有该文件。 find ~/gec-rk3568-linux/prebuilts/ -name "gstreamer-1.0.pc" -o -name "gst.h" $~.../aarch64-rk3568-linux-gnu/aarch64-buildroot-linux-gnu/sysroot/usr/include/gstreamer-1.0/gst/gst.h $~.../aarch64-rk3568-linux-gnu/aarch64-buildroot-linux-gnu/sysroot/usr/lib/pkgconfig/gstreamer-1.0.pc #编译play_movie.c文件 /home/stu/gec-rk3568-linux/prebuilts/gcc/linux-x86/aarch64/aarch64-rk3568-linux-gnu/bin/aarch64-linux-gcc \ --sysroot=$SYSROOT \ -o play_movie play_movie.c \ -I$SYSROOT/usr/include/gstreamer-1.0 \ -I$SYSROOT/usr/include/glib-2.0 \ -I$SYSROOT/usr/lib/glib-2.0/include \ -pthread \ -lgstvideo-1.0 -lgstbase-1.0 -lgstreamer-1.0 -lgobject-2.0 -lglib-2.0 \ -ldrm -lm 3. 检查嵌入式Linux设备是否具备必要的库 #检查常用的多媒体库是否存在 #检查FFmpeg 相关库是否存在 find /usr -name "libav*" -type #检查 GStreamer 命令行工具是否存在 which gst-launch-1.0 which gst-inspect-1.0 # 检查 GStreamer 库 find /usr -name "libgstreamer*" -type f 2>/dev/null # 检查 GStreamer 插件目录 ls -la /usr/lib*/gstreamer-1.0/ # 查看已安装的插件列表 gst-inspect-1.0 --version gst-inspect-1.0 | grep -i rockchip # 寻找 Rockchip 相关插件 gst-inspect-1.0 | grep -i mpp # 寻找 MPP 相关插件 gst-inspect-1.0 | grep -i omx # 寻找 OpenMAX IL 相关插件 (有时用于 VPU) gst-inspect-1.0 | grep -i decode # 寻找解码器插件 # 检查 Rockchip MPP (Media Process Platform) 库 find /usr -name "*mpp*" -type f 2>/dev/null ls -la /usr/lib*/librk* ls -la /usr/lib*/lib*mpi* # 检查是否有 Rockchip 相关的头文件目录(如果系统包含开发包) find /usr -name "*rockchip*" -type d 2>/dev/null # 查找与视频处理相关的设备节点 ls -la /dev/ | grep -i video ls -la /dev/ | grep -i vpu ls -la /dev/ | grep -i rkv # RK356X 的 VPU 设备节点通常是 rkvdec 或类似名称 ls -la /dev/rkvdec* # 这是最常见的 VPU 解码节点 ls -la /dev/rkvenc* # VPU 编码节点 ls -la /dev/ion # ION 内存管理器,VPU 通常会用到 # 查找常见的播放器 which mplayer which mpv which ffplay which vlc # 查找 FFmpeg 工具集 which ffmpeg which ffprobe # 查找 GStreamer 工具集 which gst-launch-1.0 which gst-inspect-1.0 which gst-discoverer-1.0 4. 脚本运行 Ubuntu运行自带的eog图像 嵌入式Linux播放视频文件 gst-launch-1.0 filesrc location=/oem/SampleVideo_1280x720_5mb.mp4 ! qtdemux ! h264parse ! mppvideodec ! kmssink fullscreen=true sync=false #### 使用说明 1,先配置好摄像头和开发板的ip地址,确保在同一个网段,能互相ping通。 2,把save_frames_only_one和LinkTel复制到嵌入式Linux开发板的同一目录,建议在/home/user/Eleye/目录下。 3,后台运行save_frames_only_one,即./save_frames_only_one & ,此时在后台运行,可以使用ps -a 查看进程信息的方式查看。 4,save_frames_only_one程序(服务)负责接收摄像头传输的数据,并把字节数据解析成帧图片,并保存在frame.jpg文件中。 5,后台运行LinkTel ,运行./LinkTel ./ 1 & ,意思是全屏显示。LinkTel程序(服务)会自动检测指定目录下frame.jpg文件的变化,如果有变化就更新画面。 6,运行摄像头程序,待摄像头初始化完成,图片传输,由save_frames_only_one接收图片到开发板,LinkTel显示到屏幕上。 7,除了摄像头采集,还可以传输视频文件。