我试图找到 IP 摄像机(运行 Linux)的摄像机模块设备,但没有成功。
我的主要目标是找到摄像头流,这样我就可以连接 RTSP 服务器。
更新 26/02/2019
找到与 OpenMAX (OMX) 相关的库。我一直在尝试用 gst-omx 交叉编译 GStreamer,看看我能用它做什么,但仍然没有成功。
有人熟悉 OMX 不介意指点一下吗?
$ find / -iname "*omx*"
/lib/libOMX_VSRC.so
/lib/libOMX_AVQE_A.so
/lib/libOMX_BELA.so
/lib/libOMX_IJPE_ENC_HW.so
/lib/libOMX_VMFE.so
/lib/libOMX_VSPL.so
/lib/libOMX_IJPE.so
/lib/libOMX_VVHE.so
/lib/libOMX_ASPL.so
/lib/libOMX_IJPE_MEM_MGR.so
/lib/libOMX_ALSA.so
/lib/libOMX_IJPE_ENC_SW.so
/lib/libOMX_ACODEC.so
我尝试过的
1. 寻找视频设备/dev
$ ls /dev | grep -i video
$
什么都没有...满ls /dev
这里。
2.使用ffmpeg列出设备
$ ffmpeg -devices
ffmpeg version 3.2-static http://johnvansickle.com/ffmpeg/ Copyright (c) 2000-2016 the FFmpeg developers
built with gcc 5.4.1 (Debian 5.4.1-3) 20161019
configuration: --enable-gpl --enable-version3 --enable-static --disable-debug --disable-ffplay --disable-indev=sndio --disable-outdev=sndio --cc=gcc-5 --enable-fontconfig --enable-frei0r --enable-gnutls --enable-gray --enable-libass --enable-libebur128 --enable-libfreetype --enable-libfribidi --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopus --enable-librtmp --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libvidstab --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libzimg
libavutil 55. 34.100 / 55. 34.100
libavcodec 57. 64.100 / 57. 64.100
libavformat 57. 56.100 / 57. 56.100
libavdevice 57. 1.100 / 57. 1.100
libavfilter 6. 65.100 / 6. 65.100
libswscale 4. 2.100 / 4. 2.100
libswresample 2. 3.100 / 2. 3.100
libpostproc 54. 1.100 / 54. 1.100
Devices:
D. = Demuxing supported
.E = Muxing supported
--
D dv1394 DV1394 A/V grab
DE fbdev Linux framebuffer
D lavfi Libavfilter virtual input device
DE oss OSS (Open Sound System) playback
E v4l2 Video4Linux2 output device
D video4linux2,v4l2 Video4Linux2 device grab
D x11grab X11 screen capture, using XCB
这里有一些有趣的结果,没有任何东西指向我文件系统上的设备或任何东西。
仅在 ffmpeg 中通过名称引用这些设备会引发明显的Cannot open video device
,因为这些名称不是实际设备。
3.尝试过v4l2-utils
$ v4l2-ctl --list-devices
Failed to open /dev/video0: No such file or directory
$ v4l2-sysfs-path
Alsa playback device(s): hw:0,0
4.尝试在整个文件系统中搜索某些内容
只找到了我认为是专有的解决方案。
$ ls /run | grep video
video_mainstream
video_rawstream
video_substream
$ ls -la /run/video_mainstream/
total 0
drwx------ 2 root root 60 Feb 23 17:03 .
drwxr-xr-x 14 root root 360 Jan 1 1970 ..
srwxrwxrwx 1 root root 0 Jan 1 1970 control
不知道这个空control
文件是什么。
$ ls /mnt/data/bin/
agent_client log2tf.sh miio_client miio_nas_syncer miio_sdcard network_governor.sh wifi_start.sh
factory log_diag.sh miio_client_helper_nomqtt.sh miio_ota miio_send_line play_audio_test
fetch_av miio_agent miio_devicekit miio_qrcode miio_stream post-ota.sh
ipc_client miio_alarm miio_md miio_record mortoxc pre-ota.sh
log2mi.sh miio_algo miio_nas miio_recv_line mortoxd shbf_client
许多专有脚本和二进制文件。我用 elf 工具和十六进制编辑器(fetch_av
、miio_stream
、miio_record
)分析了一些,但没有发现任何有用的东西。
PS:相机是小米mjsxj02cm(SoC msc313e,相机传感器SC2235),它使用基于linux的固件。
答案1
非常片面的答案,基于dmesg
和msc313e 数据表:
相机模块本身通过I2C控制,通过DVP/MIPI传输图像数据,并且有多个硬件图像编码器、颜色处理模块等。
从
MSYS: DMEM request: [S1:VENCDMP1]:0x00069AE0
MSYS: DMEM request: [S1:VENCDMP0]:0x00069AE0
MSYS: DMEM request: [S1:VENCDMOUT]:0x0000A100
MSYS: DMEM request: [S0:VENCDMP1]:0x0007F800
MSYS: DMEM request: [S0:VENCDMP0]:0x0007F800
MSYS: DMEM request: [S0:VENCDMOUT]:0x0000A800
我猜 VENC 的意思是“视频编码器”。还有很多 DMA 东西、“RTMPQ”(队列)等。
所以我的猜测是工作流程基于硬件和 DMA 传输。 CPU 只是设置这些传输,然后让硬件模块完成它们的工作。
你没有说这个东西是如何连接的,但如果它充当 USB 摄像头设备,一种选择是 USB 驱动程序有一个专用的内存区域作为其他硬件块生成的编码图像的目的地,并且它将只需读出图像并通过 USB 传输即可。
这将很难以任何方式进入和修改,但至少您可以通过已知地址检查内存区域,/dev/mem
并将它们与您收到的图像进行比较。