Мне нужно получить потоковое видео с камеры DJI Phantom 3 в моем приложении C ++, чтобы выполнить обработку Computer Vision в OpenCV.
Сначала я попытался отправить необработанные данные H264 через сокет UDP, внутри этого обратного вызова:
mReceivedVideoDataCallBack = new CameraReceivedVideoDataCallback() {
@Override
public void onResult(byte[] videoBuffer, int size) {
//Here, I call a method from a class I created, that sends the buffer through UDP
if (gravar_trigger) controleVideo.enviarFrame(videoBuffer, size);
if (mCodecManager != null) mCodecManager.sendDataToDecoder(videoBuffer, size);
}
};
Это общение выше работает хорошо. Однако я не смог декодировать эти данные UDP H264 в моем настольном приложении C ++. Я проверил с FFmpeg lib, но не смог выделить AVPacket
с моими данными UDP, для того, чтобы декодировать с помощью avcodec_send_packet
а также avcodec_receive_frame
, У меня тоже были проблемы с AVCodecContext
, поскольку мое UDP-соединение не было потоком, подобным RTSP, где он мог получить информацию об источнике. Поэтому мне пришлось изменить то, как я пытался решить проблему.
Затем я нашел libstreaming, в котором можно ассоциировать для потоковой передачи видеокамеры Android на Wowza Server, создание чего-то вроде потокового соединения RTSP, где данные можно было бы легко получить в моем окончательном приложении C ++ с использованием OpenCV videoCapture
, Тем не менее, libstreaming использует свои собственные surfaceView
, Другими словами, я должен был бы связать libstreaming surfaceView
с DJI Drone’s videoSurface
, Я действительно новичок в Android, так что понятия не имею, как это сделать.
Подводя итог, это правильный подход? У кого-то есть идея получше? заранее спасибо
Я собираюсь поставить пару вещей. Ну, в основном одно. Обычно необходимо обрабатывать создание фрагментированных видео пакетов перед их отправкой. IDR h264 слишком велики для потоковой передачи udp.
Имея надежную связь между конечными точками, вы можете добавить метод, который преобразует один потенциально большой входной пакет в один или несколько небольших выходных пакетов.
Пакеты, которые больше, чем, возможно, 1000 байтов, должны быть разбиты на несколько HAL64 типа 28 NALU. Пакеты, которые являются небольшими и имеют одинаковую временную метку, могут быть отправлены в STAP-A типа 24. Как правило, вы можете найти внутрисетевые sps / pps в степе.
После того, как вы получите упаковщик для IDR и больших ломтиков, напишите свой депакетизатор на приемнике, и тогда вы получите четкие декодированные изображения.
Обратитесь к спецификации h264 RTP для получения типа 28.
После долгого времени я наконец-то разработал систему, которая может правильно транслировать дрон-камеру DJI