Usb - камера android (изохронная передача)
Привет,
из-за того, что некоторые чипсеты на Android не поддерживают Изохронную передачу для потоковой передачи usb-камеры, я хочу попробовать другой способ над самокомпилируемым приложением. Это приложение должно использовать свой доступ к камере через JNA, чтобы запустить видеопоток.
Вы можете посмотреть мой проект на github:
Гитхаб - Питер-Ст/UVC_camera_usb_iso[^]
Первым делом нужно было правильно связать JNA.jar к программе. Я решил эту проблему, загрузив jna.jar откуда jna/dist at master · java-native-access/jna · GitHub[^] и связал его с правильной библиотекой *.so для проекта. Следующая часть-изучить приложение, чтобы запустить видеопоток
С уважением,
Питер
Что я уже пробовал:
В своем проекте я использую usbiso.java код, который можно найти: UsbIso - USB isochronous transfer controller (Java класс для Android / Linux)[^]
Остальная часть проекта проходит через main.java код.
David Crow
"...но приложение всегда выходит из строя с ошибкой класса java."
И в чем именно будет заключаться эта ошибка?
David Crow
Кроме сообщений Logcat, которые в большинстве своем являются системными сообщениями, в чем именно заключается проблема? Все, что я вижу в вашем коде, - это создание UsbIso
объект, с последующим вызовом его preallocateRequests()
и getRequest()
методы. Они что, не работают? Создается ли исключение?
Peter____
С моей камерой microdia я получу следующую ошибку:
E/UsbCamTest1: ошибка в MainActivity
Ява.яз.Исключение: невозможно претендовать на интерфейс управления камерой.
в humer.uvc_camera.Main.openCameraDevice(Main.java:318)
в humer.uvc_camera.Main.openCam(Main.java:200)
at humer.uvc_camera.Main.openCamButtonClickEvent(Main.java:191)
в java.lang.reflect.Метод.invokeNative(родной метод)
в java.lang.reflect.Method.invoke(Method.java:511)
в android.view.View$1.onClick(View.java:3058)
в android.view.View.performClick(View.java:3534)
на Андроид.смотреть.Смотреть$PerformClick.запустить(просмотреть.Ява:14263)
в android.os.Handler.handleCallback(Handler.java:605)
в android.os.Handler.dispatchMessage(Handler.java:92)
на Андроид.ОС."Петля времени".петли(лупер.Ява:137)
в android.app.ActivityThread.main(ActivityThread.java:4441)
в java.lang.reflect.Метод.invokeNative(родной метод)
в java.lang.reflect.Method.invoke(Method.java:511)
в com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java)
на com.android.internal.os.ZygoteInit.main(ZygoteInit.java)
в de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132)
в dalvik.system.NativeStart.main(собственный метод)
Peter____
С помощью моей камеры arcmicro я получаю следующий logcat:
D/libEGL: загружено /system/lib/egl/libEGL_mali.so
D/libEGL: loaded /system/lib/egl/libGLESv1_CM_mali.so
D/libEGL: loaded /system/lib/egl/libGLESv2_mali.so
D/OpenGLRenderer: включение режима отладки 0
I/UsbCamTest1: количество USB-устройств = 1
I/UsbCamTest1: USB-устройство "/dev/bus/usb/001/025": UsbDevice[mName=/dev/bus/usb/001/025,mVendorId=6380,mProductId=13200,mClass=239,mSubclass=2,mProtocol=1,mInterfaces=[Landroid.os.Parcelable;@41e025f8]
I/UsbCamTest1: количество USB-устройств = 1
I/UsbCamTest1: USB-устройство "/dev/bus/usb/001/025": UsbDevice[mName=/dev/bus/usb/001/025,mVendorId=6380,mProductId=13200,mClass=239,mSubclass=2,mProtocol=1,mInterfaces=[Landroid.os.Parcelable;@41e05318]
I/UsbCamTest1: количество USB-устройств = 1
I/UsbCamTest1: USB-устройство "/dev/bus/usb/001/025": UsbDevice[mName=/dev/bus/usb/001/025,mVendorId=6380,mProductId=13200,mClass=239,mSubclass=2,mProtocol=1,mInterfaces=[Landroid.os.Parcelable;@41e0a258]
Д/dalvikvm: пытаюсь загрузить файл lib /сведения/сведения/Хьюмер.uvc_camera/Либ/libjnidispatch.так 0x41dcf1a8
Д/dalvikvm: добавил общий файл lib /сведения/сведения/Хьюмер.uvc_camera/Либ/libjnidispatch.так 0x41dcf1a8
I/UsbCamTest1: Warning: getVideoStreamErrorCode() failed: java.lang.Исключение: ошибка VS_STREAM_ERROR_CODE_CONTROL, len=-1.
I/UsbCamTest1: начальная потоковая передача parms: hint=0x0 format=1 frame=1 frameInterval=2000000 keyFrameRate=0 pFrameRate=0 compQuality=0 compWindowSize=0 delay=0 maxVideoFrameSize=0 maxPayloadTransferSize=0
I/UsbCamTest1: Probed streaming parms: hint=0x0 format=1 frame=1 frameInterval=2000000 keyFrameRate=0 pFrameRate=0 compQuality=0 compWindowSize=0 delay=0 maxVideoFrameSize=614400 maxPayloadTransferSize=3000
I/UsbCamTest1: Final streaming parms: hint=0x0 format=1 frame=1 frameInterval=2000000 keyFrameRate=0 pFrameRate=0 compQuality=0 compWindowSize=0 delay=0 maxVideoFrameSize=614400 maxPayloadTransferSize=3000
Здесь не было никаких сообщений об ошибках, но приложение показывает только бледно-белый экран. Вопрос будет заключаться в том, как запустить видеопоток?
Заранее спасибо,
Питер
Peter____
Весь проект android studio находится в моем РЕПО github:
https://github.com/Peter-St/UVC_camera_usb_iso
Peter____
Я думаю, что мне не хватает правильных значений для части моего Main.java чтобы запустить поток:
дело arkmicro:
camStreamingAltSetting = 11;
maxPacketSize = 3 * 1000;
camFormatIndex = 1;
camFrameIndex = 1;
camFrameInterval = 2000000;
packetsPerRequest = 40;
activeUrbs = 8;
перерыв;
Эти значения я считываю с помощью команды "lsusb-v-d xxxx:xxxx", которая является частью видеопотока. При разных значениях переменных: "packetsPerRequest" и "activeUrbs" я получаю разные сообщения об ошибках("на устройстве не осталось места", "размер выделения должен быть больше нуля" и "не хватает памяти"). Если я оставлю эти переменные в стороне, я не получу никакой ошибки, но и никакого видеопотока.
David Crow
Вы не подумали спросить об этом автора книги? UsbIso
класс, Кристиан д''Heureuse?
Peter____
да, он сказал мне, что эти две переменные важны для веб-потока. Другим предложением было бы просмотреть исходный код (операторы журнала), чтобы понять процесс работы приложения. В настоящее время я пытаюсь это сделать.
Интересно здесь то, что с 2-х разных устройств, на которых я тестировал программу, получается два разных кода ошибок: один из них-это ошибка no space left on device, которую это устройство также получает обычным способом через JNI при подключении к веб-камере.
Следующим шагом было бы заставить программу работать на двух камерах, которые я собираюсь использовать на микроскопе, чтобы получить снимки записи.
Если это поможет, я также могу опубликовать выходные данные моих двух камер, чтобы понять процессный поток (lsusb-v-d xxxx:xxxx).
Пока что,
Питер
Peter____
Обновление:
Я решил получить первые кадры с камеры. А вместе с ним приходит и новая беда. Кадры, которые я получаю, были слишком малы (первый: 10436 байт, второй: 21848 байт, третий: 21848 байт, а следующие намного меньше ... ~ 4000 байт.) Для рабочего потока кадры должны быть размером 38400 байт (разрешение = 160 x 120).
Следующие шаги будут заключаться в увеличении размера фрейма за счет более быстрого приема коэффициента - > меньшего размера пакета, maxPacketSize и большего количества packetsPerRequest.
Питер
Peter____
Полученные Кадры:
D/dalvikvm: GC_CONCURRENT освобожден 440K, 18% свободен 3500K/4231K, приостановлен 1ms+1ms
D/dalvikvm: GC_CONCURRENT освобожден 412K, 17% свободен 3516K/4231K, приостановлен 1ms+2ms
D/dalvikvm: GC_CONCURRENT освобожден 483K, 19% свободен 3513K/4295K, приостановлен 1ms+3ms
D/dalvikvm: GC_CONCURRENT освобожден 464K, 18% свободен 3533K/4295K, приостановлен 2ms+1ms
D/dalvikvm: GC_CONCURRENT освобожден 471K, 19% свободен 3521K/4295K, приостановлен 1ms+1ms
D/dalvikvm: GC_CONCURRENT освобожден 446K, 18% свободен 3538K/4295K, приостановлен 1ms+1ms
D/dalvikvm: GC_CONCURRENT освобожден 440K, 18% свободен 3540K/4295K, приостановлен 1ms+1ms
D/dalvikvm: GC_CONCURRENT освобожден 447K, 18% свободен 3540K/4295K, приостановлен 1ms+1ms
D/dalvikvm: GC_CONCURRENT освобожден 429K, 18% свободен 3563K/4295K, приостановлен 1ms+1ms
D/dalvikvm: GC_CONCURRENT освобожден 441K, 18% свободен 3546K/4295K, приостановлен 1ms+2ms
D/dalvikvm: GC_CONCURRENT освобожден 422K, 18% свободен 3554K/4295K, приостановлен 1ms+1ms
D/dalvikvm: GC_CONCURRENT освобожден 438K, 18% свободен 3553K/4295K, приостановлен 1ms+1ms
D/dalvikvm: GC_CONCURRENT освобожден 439K, 18% свободен 3552K/4295K, приостановлен 1ms+1ms
D/dalvikvm: GC_CONCURRENT освобожден 402K, 17% свободен 3567K/4295K, приостановлен 1ms+1ms
D/dalvikvm: GC_CONCURRENT освобожден 395K, 17% свободен 3573K/4295K, приостановлен 1ms+2ms
D/dalvikvm: GC_CONCURRENT освобожден 471K, 19% свободен 3574K/4359K, приостановлен 1ms+1ms
D/dalvikvm: GC_CONCURRENT освобожден 447K, 18% свободен 3593K/4359K, приостановлен 1ms+1ms
I/UsbCamTest1: requests=317 packetCnt=317 packetErrorCnt=0 packet0Cnt=5, packet12Cnt=0, packetDataCnt=312 packetHdr8cCnt=123 frameCnt=57
I/UsbCamTest1: 1/0 len=1280 data=0c 8c 00 00 00 00 9c 1e 4b 4b 31 05 10 80 10 80 10 80 10 80 10 80 10 80 10 80 10 80 10 80 10 80
I/UsbCamTest1: 2/0 len=1280 data=0c 8c 00 00 00 00 0c d5 66 4b 3f 06 10 80 10 80 10 80 10 80 10 80 10 80 10 80 10 80 10 80 10 80
I/UsbCamTest1: 3/0 len=1280 data=0c 8c 00 00 00 00 35 ea 6f 4b 97 06 10 80 10 80 10 80 10 80 10 80 10 80 10 80 10 80 10 80 10 80
I/UsbCamTest1: 4/0 len=1280 data=0c 8c 00 00 00 00 8e 27 78 4b e7 06 10 80 10 80 10 80 10 80 10 80 10 80 10 80 10 80 10 80 10 80
I/UsbCamTest1: 9/0 len=1280 data=0c 8c 00 00 00 00 df 37 81 4b 3f 07 10 80 10 80 10 80 10 80 10 80 10 80 10 80 10 80 10 80 10 80
I/UsbCamTest1: 10/0 len=1280 data=0c 8c 00 00 00 00 a5 00 ca 4b 01 02 10 80 10 80 10 80 10 80 10 80 10 80 10 80 10 80 10 80 10 80
I/UsbCamTest1: 11/0 len=1280 data=0c 8c 00 00 00 00 ba 7e cf 4b 37 02 10 80 10 80 10 80 10 80 10 80 10 80 10 80 10 80 10 80 10 80
I/UsbCamTest1: 12/0 len=1280 data=0c 8c 00 00 00 00 02 be e5 4b 0f 03 10 80 10 80 10 80 10 80 10 80 10 80 10 80 10 80 10 80 10 80
I/UsbCamTest1: 13/0 len=304 data=0c 8e 00 00 00 00 1f a3 fd 4b f7 03 10 80 10 80 10 80 10 80 10 80 10 80 10 80 10 80 10 80 10 80 EOF frameLen=10436
I/UsbCamTest1: 14/0 len=1280 data=0c 8d 70 0f 13 4c 8d 0f 13 4c c7 04 10 80 10 80 10 80 10 80 10 80 10 80 10 80 10 80 10 80 10 80
I/UsbCamTest1: 15/0 len=1280 data=0c 8d 70 0f 13 4c 21 d2 26 4c 87 05 10 80 10 80 10 80 10 80 10 80 10 80 10 80 10 80 10 80 10 80
I/UsbCamTest1: 16/0 len=1280 data=0c 8d 70 0f 13 4c 65 9c 3a 4c 47 06 10 80 10 80 10 80 10 80 10 80 10 80 10 80 10 80 10 80 10 80
I/UsbCamTest1: 17/0 len=1280 data=0c 8d 70 0f 13 4c d3 62 4e 4c 07 07 10 80 10 80 10 80 10 80 10 80 10 80 10 80 10 80 10 80 10 80
I/UsbCamTest1: 18/0 len=1280 data=0c 8d 70 0f 13 4c f6 47 66 4c ef 07 10 80 10 80 10 80 10 80 10 80 10 80 10 80 10 80 10 80 10 80
Я/UsbCamTest1: 19/0 лен=сведения 1280=0С 70 0С 4С 6д 8д 13 99 93 4С А7 01 01 00 01 01 7Д 7е 7е 7е 7е 7Б 7Б 02 02 02 01 01 01 7Ф 7Д 7е
Я/UsbCamTest1: 20/0 лен=сведения 1280=8д 0С 70 0С 13 4С 60 ка ае 4С АФ 02 01 00 00 00 7Ф 7С 7С 7С 7С 7Э 7Э 00 00 00 01 00 00 7Ф 7Б 7Д
Я/UsbCamTest1: 21/0 лен=сведения 1280=8д 0С 70 0С 13 4С А9 65 Д1 4С ФФ 79 03 02 02 02 01 00 01 7е 7а 7в 7б 7г 7а 7г 7Д 7а 01 02 02 02
Я/UsbCamTest1: 22/0 лен=сведения 1280=0С 70 0С 4С 8г 13 22 88 Ф1 4С 37 05 02 02 02 02 02 78 7а 7Д 7е 7а 7в 7Д 7е 7а 01 02 02 02 02 7е
Я/UsbCamTest1: 23/0 лен=сведения 1280=8д 0С 70 0С 13 4С 3Ф 1Ф 4Д 6д 09 06 11 77 11 7е 10 76 0С 0С 0С 10 0С 76 78 7С, 7е, 7Д 0е 0е 77 7Ф
I/UsbCamTest1: 24/0 len=1280 data=0c 8d 70 0f 13 4c 7c 7f 20 4d ff 06 11 7c 11 84 11 78
Peter____
ОБНОВЛЕНИЕ:
К тому времени я все еще мог получить некоторые кадры из моей камеры. Специфика заключается в том, что устройство может отправлять только те кадры, которые были отправлены с помощью low maxPacketSize. Большинство камер поддерживают более одного maxPacketSizes для отправки потока, и вот разница в конкретных чипсетах телефонов MTK и Novathor, которые подают только низкий maxPacketSize. Мои устройства Qualcomm получают все максимальные пакеты, которые может отправить камера.
Более подробную информацию о УФ-трансляций можно ознакомиться здесь --&ГТ; http://www.usb.org/developers/docs/devclass_docs/
Кроме того, устройствам было проще получать кадры в формате MJPEG, которые несжимали YUV.
Пока что,
Питер
Peter____
До сих пор поток MJpeg работает, и через Huffmantable я могу получить растровое изображение JPeg, которое может быть отображено через класс Imageview на интерфейс пользователя.
Следующая часть будет состоять в том, чтобы получить запущенное видео. Были две возможности: через класс mediaplayer или непосредственно к примеру VLC. На данный момент я работаю над этим, но я рад за помощь, как получить видеопоток на моем существующем проекте.
Пока что,
Питер
Peter____
Обновление: видеопоток теперь работает. Поток на более новых устройствах (KitKat) довольно быстрый и без задержек. На старых устройствах видеопоток также работает, но при высоком разрешении наблюдается умеренное отставание.