임베디드 Linux SoC에서 비디오 장치 가져오기

임베디드 Linux SoC에서 비디오 장치 가져오기

IP 카메라(Linux 실행)용 카메라 모듈 장치를 찾으려고 하는데 성공하지 못했습니다.

나의 주요 목표는 RTSP 서버에 연결할 수 있도록 카메라 스트림을 찾는 것입니다.

2019년 2월 26일 업데이트됨

OpenMAX(OMX) 관련 라이브러리를 찾아보세요. 나는 GStreamer를 gst-omx와 크로스 컴파일하여 무엇을 할 수 있는지 알아보려고 노력했지만 여전히 성공하지 못했습니다.

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

여기에는 몇 가지 흥미로운 결과가 있습니다. 내 파일 시스템의 장치나 그 어떤 것도 가리키지 않습니다.

Cannot open video deviceffmpeg에서 이러한 장치를 이름으로 단순히 참조하면 이러한 이름이 실제 장치가 아니기 때문에 분명해집니다 .

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

많은 독점 스크립트 및 바이너리. 엘프 도구와 16진수 편집기( fetch_av, miio_stream, ) 를 사용하여 일부를 분석했지만 miio_record유용한 것을 찾지 못했습니다.

추신: 카메라는 Xiaomi 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하고 받은 이미지와 비교할 수 있습니다.

관련 정보