内窥镜相机 YPC99 - 如何在 linux 上流式传输

逆向工程 linux 安卓
2021-07-08 02:35:06

我正在尝试YPC99使用 WiFi 连接Linux PC 上的内窥镜摄像头流式传输视频从我目前发现的情况来看,摄像机使用的是 IP 192.168.1.1。它支持RTSP7070 端口(唯一一个开放的端口)上的协议。DESCRIBE报告说,流应该是JPEG视频(RTP/AVP 26

DESCRIBE rtsp://192.168.1.1:7070/webcam RTSP/1.0
CSec: 2

RTSP/1.0 200 OK
Content-Base: rtsp://192.168.1.1:7070/webcam/
Content-Type: application/sdp
Content-Length: 122

v=0
o=- 1 1 IN IP4 127.0.0.1
s=Test
a=type:broadcast
t=0 0
c=IN IP4 0.0.0.0
m=video 0 RTP/AVP 26
a=control:track0

VLC正在显示黑屏。ffmpeg也无法检测到要使用的正确编解码器:

$ ffmpeg -i rtsp://192.168.1.1:7070/webcam  -vcodec copy /tmp/abc.mp4
ffmpeg version n4.2.2 Copyright (c) 2000-2019 the FFmpeg developers
  built with gcc 9.3.0 (Arch Linux 9.3.0-1)
  configuration: --prefix=/usr --disable-debug --disable-static --disable-stripping --enable-fontconfig --enable-gmp --enable-gnutls --enable-gpl --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libdav1d --enable-libdrm --enable-libfreetype --enable-libfribidi --enable-libgsm --enable-libiec61883 --enable-libjack --enable-libmfx --enable-libmodplug --enable-libmp3lame --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libv4l2 --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxcb --enable-libxml2 --enable-libxvid --enable-nvdec --enable-nvenc --enable-omx --enable-shared --enable-version3
  libavutil      56. 31.100 / 56. 31.100
  libavcodec     58. 54.100 / 58. 54.100
  libavformat    58. 29.100 / 58. 29.100
  libavdevice    58.  8.100 / 58.  8.100
  libavfilter     7. 57.100 /  7. 57.100
  libswscale      5.  5.100 /  5.  5.100
  libswresample   3.  5.100 /  3.  5.100
  libpostproc    55.  5.100 / 55.  5.100
[mjpeg @ 0x55ef344d0900] dqt: 0 quant value
    Last message repeated 58 times
[rtsp @ 0x55ef344ccfc0] decoding for stream 0 failed
[rtsp @ 0x55ef344ccfc0] Could not find codec parameters for stream 0 (Video: mjpeg, none(bt470bg/unknown/unknown)): unspecified size
Consider increasing the value for the 'analyzeduration' and 'probesize' options
Input #0, rtsp, from 'rtsp://192.168.1.1:7070/webcam':
  Metadata:
    title           : Test
  Duration: N/A, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: mjpeg, none(bt470bg/unknown/unknown), 90k tbr, 90k tbn, 90k tbc
[mp4 @ 0x55ef344fcc40] dimensions not set
Could not write header for output file #0 (incorrect codec parameters ?): Invalid argument
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
    Last message repeated 1 times

我有wireshark几秒钟的流转储(当我试图用 VLC 播放它时)。从我读过的内容来看,每一帧都FFD8应该以FFD9. 没有单个包包含FFD8但有很多包含FFD9,所以我无法找出帧的开头,看看那里的某些标题是否可以帮助我。

andoridiPhone应用来观看来自摄像机的流。该应用程序名为YCamera我已经下载了andorid应用程序(https://apkpure.com/ycamera/cn.com.buildwin.YCamera)并反编译了它。在资源目录中有以下库:

  • libijkffmpeg.so
  • libijkplayer.so
  • libijksdl.so

似乎libijkffmpeg.so是处理流的一个(字符串bt470bg仅在其中找到)。根据我的研究(对于这个,我不确定我是否在寻找我应该找的地方)它是ijkplayer玩家的一部分,应该基于ffmpeg但奇怪的ffmpeg是无法识别流。

我知道我的问题太开放了,但有什么建议可以让我继续进步吗?

最终目标是能够公开此流。为此目的,最好是ffmpegvlc能够识别流。

4个回答

好的,我已经开始通过连接到 PCB 的 RX/TX 来研究这个问题。

波特率为 921600 (8N1),我得到这个输出:

system version:84.12.5.4.87
param: clock=1615037753
param: tz=-3600
usb host begin 
USBHALHost init  begin 
musb change to bdevice after usbc reset 
set_network_ap,enter
usb connect 0x10
----------------maclib task 

 mark ip 1

 ip_table.ip_range[0] = 0x1

 mark ip 1

 ip_table.ip_range[0] = 0x1
usb device connect 
[bool USBHostCam::connect():105]Trying to connect Cam device
vid:0x5004,pid:0x4979
find mjpeg format index 1
find mjpeg frame 640*360 index 1
find mjpeg frame 640*480 index 2
find mjpeg frame 1280*720 index 3
altsetting 1 max_packet_size 4608
altsetting 2 max_packet_size 3072
altsetting 3 max_packet_size 1024
altsetting 4 max_packet_size 512
fifo_count is 26
get_cur 0
01 00 01 01 80 96 98 00 00 00 00 00 00 00 00 00 00 00 00 8c 0a 00 00 06 00 00 
fifo_count is 26
set intf format 1, frame 1
set intf altsetting 1
1 min
2 min
3 min
....
N min
N+1 min

我可以使用 VCC (3.3V) 为其供电。仍然没有发现他们正在使用什么固件以及如何获得访问权限。我想我会在这里发布我的发现。当我知道更多时会更新。

G=TXd, Y=RXd, R=VCC(3.3V), B=GND

https://hackaday.io/project/19680/logs

我知道已经 10 个月了,但是如果您对问题的答案感兴趣,那么廉价的 wifi 无人机中使用了相同的模块和协议。里面有几个金块。当我查看正在嗅探的应用程序的 Wireshark 日志时,我注意到一件事,每次发送这些数据包中的一个时,都会为客户端和服务器分配一个新端口。

 OPTIONS rtsp://192.168.1.1:7070/webcam RTSP/1.0
 CSeq: 1
 User-Agent: Lavf56.40.101

 RTSP/1.0 200 OK
 CSeq: 1
 Public: DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE

 DESCRIBE rtsp://192.168.1.1:7070/webcam RTSP/1.0
 Accept: application/sdp
 CSeq: 2
 User-Agent: Lavf56.40.101

 RTSP/1.0 200 OK
 CSeq: 2
 Content-Base: rtsp://192.168.1.1:7070/webcam/
 Content-Type: application/sdp
 Content-Length: 122

 v=0
 o=- 1 1 IN IP4 127.0.0.1
 s=Test
 a=type:broadcast
 t=0 0
 c=IN IP4 0.0.0.0
 m=video 0 RTP/AVP 26
 a=control:track0
 SETUP rtsp://192.168.1.1:7070/webcam/track0 RTSP/1.0
 Transport: RTP/AVP/UDP;unicast;client_port=8974-8975
 CSeq: 3
 User-Agent: Lavf56.40.101

 RTSP/1.0 200 OK
 CSeq: 3
 Transport: RTP/AVP;unicast;client_port=8974-8975;server_port=52844-52845
 Session: AEAFB0B1B2B3B4B5B6B7B8B9BABBBC

 PLAY rtsp://192.168.1.1:7070/webcam/ RTSP/1.0
 Range: npt=0.000-
 CSeq: 4
 User-Agent: Lavf56.40.101
 Session: AEAFB0B1B2B3B4B5B6B7B8B9BABBBC

 RTSP/1.0 200 OK
 CSeq: 4
 Session: AEAFB0B1B2B3B4B5B6B7B8B9BABBBC

这似乎是困扰互联网的一个问题。FFMpeg 及其所有我尝试过的衍生产品(VideoLan、GStreamer...)无法正确解码此类相机使用的 MJPeg 格式(用于多种类型的无人机、I-Spy Mini 坦克和内窥镜相机 YPC99)提到)。为所有这些产品提供的 android 软件基于 IjkPlayer 开源(主要是 ffmpeg 特定构建),但是我尝试过的所有 Windows 版本都无法完成这项工作。(我已经在https://trac.ffmpeg.org/ticket/8211 中发布了我的观点

解决方案可能在于缓冲区大小的计算 [¿?] 这是整个过程中唯一的区别。一一对比Android上的IjkPlayer(FFmpeg:ff3.3--bw0.8.0--20180323--001-1-geb1575fefe)和Windows上的FFPLAY(版本4.3.2-2021-02-27-full_build)的分析顺序-www.gyan.dev) 它们完全相同,除了到达解码 JFIF 标记的阶段(特别是 DA 标记 [扫描开始]):IJKMEDIA [IjkPlayer] 标记=daavail_size_in_buf=37009 组件:0 组件: 1 个组件:2 个标记解析器使用了 36932 字节(295454 位)

ffplay -loglevel debug -i rtsp://192.168.1.1:7070/webcam [mjpeg @ 05ff6740] 标记=daavail_size_in_buf=17132 组件:0 组件:1 组件:2 mjpeg_decode_dc:坏 vlc:0:06edca85 错误错误 y=1 x=0 标记解析器使用了 196 字节(1568 位)

我仍在等待一些建议,并将继续研究围绕此问题的任何可能的解决方案。希望你比我幸运!

问题解决了!

它需要 ffmpeg 中的一个小补丁,因为这种类型的相机使用的 mjpeg 格式不完全符合标准的 FF DD [重启间隔] JPEG 标记。

它是由“cehoyos”解决的。详情请见https://trac.ffmpeg.org/ticket/8211

此解决方案适用于某些 wifi-rc-tanks 中使用的摄像机、一些廉价无人机和 [我假设] YPC99 和其他使用 rtsp://192.168.1.1:7070/webcam url 的摄像机(并且可由 IjkPlayer 播放android中的库)。随意测试它并报告您的发现。

快乐工程!