获取嵌入式 Linux SoC 上的视频设备

获取嵌入式 Linux SoC 上的视频设备

我试图找到 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_avmiio_streammiio_record)分析了一些,但没有发现任何有用的东西。

PS:相机是小米mjsxj02cm(SoC msc313e,相机传感器SC2235),它使用基于linux的固件。

答案1

非常片面的答案,基于dmesgmsc313e 数据表:

相机模块本身通过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并将它们与您收到的图像进行比较。

相关内容