M300挂载相机,无法获取相机画面

Completed

Comments

48 comments

  • DJI Developer Support
    ![](https://djisdksupport.zendesk.com/attachments/token/NTy5AtOzCmCbuJuC0cAk8pvEi/?name=image.png) CAMERA的含义是主相机。你将payload挂载的位置设置为主视频源之后,也是无法显示画面吗? ![](https://djisdksupport.zendesk.com/attachments/token/JadEHie3um6e7dTnPpXE6OQXU/?name=image.png)
    0
    Comment actions Permalink
  • Caiyixun

    事实上,我已经放弃了。在寻求其他方式解决了。

    另外,不是不能显示画面,而是有一瞬间的画面。然后就被FPV的画面挤占了。如果把CAMERA换成其他的,比如我尝试过的SECONDARY_CAMERA。连着一瞬间的画面都是没有的。而我前端一直留了两个显示屏幕,第二个屏幕永远看不到画面。第一个屏幕则是如果你设置的是CAMERA,那有一瞬间的画面,然后就会迅速被FPV的画面挤占。我测试过了多次了,就是有。但是如果你把CAMERA换成SECONDARY_CAMERA(或者是FPV)。那连这一瞬间都没有了。

    0
    Comment actions Permalink
  • Caiyixun

    如果您需要,我可以把我手里的这个demo发给您,如果不需要,那就算了。

    而目前我在寻求其他的解决方式,比如用UX SDK中的FPVWidget控件,我不想理清楚里面的逻辑,我只需要设置好setVideoSource(FPVWidget.VideoSource.PRIMARY);然后针对M300无人机开一下通道:ocuSyncLink.assignSourceToPrimaryChannel(PhysicalSource.LEFT_CAM, PhysicalSource.FPV_CAM,

    不知道如果是这种方法,还有编码格式的问题吗?

    0
    Comment actions Permalink
  • Caiyixun

    好像也是不行的,行不通。。。。。

    0
    Comment actions Permalink
  • DJI Developer Support
    FPVWidget控件内部使用的是与sample显示视频流相同的方法,因为fpvwidget应该也无法实现您的需求。 你可以将你修改之后的VideoFeederView.java和VideoFeedView.java发给我,以及告诉我你所使用的负载的psdk版本。
    0
    Comment actions Permalink
  • Caiyixun

    我目前使用的PSDK是2.2.1.

    单云台(后面可能会换成双云台,但目前是单云台)相机。编码格式是CUS H264

    0
    Comment actions Permalink
  • Caiyixun

    我在翻社区的时候,看到了很多回答,好像不少人调用provideTranscodedVideoFeed。我查了API。它返回的也是和getPrimaryVideoFeed()的返回类型是一样的。

    0
    Comment actions Permalink
  • Caiyixun

    我成功拿到画面了,挂载的相机的画面。就是那个provideTranscodedVideoFeed。不能再用getPrimaryVideoFeed()。但不是很成功。因为画面两三秒是消失一秒,然后再出现,而且那个视频源显示的依旧是:未知。

    0
    Comment actions Permalink
  • Caiyixun

    现在问题就是在于,我一个显示屏幕显示的是挂载相机,它是CUS H264编码的,另外一个显示屏幕显示的是FPV,它是DJI H264编码的。自从我调成功有挂载相机画面之后,FPV就一直没画面了。

    0
    Comment actions Permalink
  • Caiyixun

    我重新从头整理一下,这两个类的代码被我改来改去的。重新理一下逻辑层。看看是不是哪里画面被挤占了

    0
    Comment actions Permalink
  • DJI Developer Support
    CUS H264和DJI H264决定的其实是视频数据的传输通道,传输的视频流格式都是H264的。之前为了解释PSDK视频数据可以从两个位置获取的时候可能给你带来了误解。 我重新从头整理一下,这两个类的代码被我改来改去的。重新理一下逻辑层。看看是不是哪里画面被挤占了 -- 好的,如果仍存在问题可以将VideoFeederView.java和VideoFeedView.java发给我分析。 上传地址:https://pan-sec.djicorp.com/s/giTQdBHs3gJGPJf
    0
    Comment actions Permalink
  • Caiyixun

    我已经上传了文件。画面依旧是有问题的,现在是可以看到画面了,但是每隔三四秒就会黑屏一秒,然后重复这样的。我不知道是哪里的问题,或者是什么关键帧缺失?但是官方的APP(飞行遥控器上的)就不会有黑屏的。说明是单纯我的代码的问题

    0
    Comment actions Permalink
  • DJI Developer Support
    我查看了你的代码,它的确是存在错误的。在VideoFeedView里,你新增了一个方法用于实现编码器获取视频流数据,但在这个方法里你对这个编码器添加了两组视频数据,一个是通过setVideoDataReceivedCallback获取到的,还有一个是VideoFeeder.VideoDataListener获取到的。 ![](https://djisdksupport.zendesk.com/attachments/token/dpMLImIo3vYX24LVWBXRkmm1A/?name=image.png) 而这个VideoFeeder正是你通过provideTranscodedVideoFeed获取到的。 ![](https://djisdksupport.zendesk.com/attachments/token/fLqDQoDnuOCrfc7h8yjrU4Dih/?name=image.png) 一个编解码器建议是只接收一组视频流数据,你是想要接收哪一种呢?
    0
    Comment actions Permalink
  • Caiyixun

    什么意思啊?我要的肯定是setVideoDataReceivedCallback获取到的。但是为什么VideoFeeder.VideoDataListener也能获取到?它不就是一个监听器吗?那如果不要VideoFeeder.VideoDataListener,该如何去掉?

    0
    Comment actions Permalink
  • Caiyixun

    我测试了一下,去掉谁好像都不行啊?怎么去掉其中一组数据啊,我最终只要画面能正常显示就可以。

    0
    Comment actions Permalink
  • Caiyixun

    我有点明白你说的意思的,你应该说的是这两组吧?

    我对第二个加了判断,因为我预设的就是第一个相机是挂载相机,编码是CUS,第二个是FPV,编码是DJI。用这个来判断要不要使用sendDateToDecoder。

    但是目前这样改的话,很僵硬,不过至少功能是实现了。

    后面我再想想如何优化,不然总不能永远第一相机是CUS编码、第二个一定是DJI编码的。

    0
    Comment actions Permalink
  • Caiyixun

    本来想用payload.isDJIVideoStreamingChannelAvailable()来试试优化的,但是好像没有用,因为FPV不属于payload,目前我就挂载了一个单云台相机,换句话说就是,payload.isDJIVideoStreamingChannelAvailable()永远返回的是flase?那如果我挂载的是双云台,两个相机,一个是DJI编码、一个是CUS编码,payload.isDJIVideoStreamingChannelAvailable()是如何返回的?其实我不懂的是双云台+两个相机。这样算一个负载还是算两个负载。如果算两个负载的话,获取负载应该也像相机那样有排序吧?

    0
    Comment actions Permalink
  • DJI Developer Support
    1、其实我不懂的是双云台+两个相机。这样算一个负载还是算两个负载。如果算两个负载的话,获取负载应该也像相机那样有排序吧? -->之前有提到通过getCameras和Aircraft.getpayloads获取到飞机当前挂载两种负载的列表,这样就可以获取到两种不同类型的负载。然后可以通过getIndex 获取到位置信息,不知道这是不是你想要获取的排序。 2、那如果我挂载的是双云台,两个相机,一个是DJI编码、一个是CUS编码,payload.isDJIVideoStreamingChannelAvailable()是如何返回的 -->DJI H264和CUS H264更多决定是传输通道,PSDK传输视频流数据统一使用的是H264编码格式。如果你挂了两个,那么就可以通过问题1提到的getpayloads获取到全部payload,通过payload.isDJIVideoStreamingChannelAvailable()来判断它的视频流需要从哪里获取,true就是DJI通道,false就是CUS通道。 3、本来想用payload.isDJIVideoStreamingChannelAvailable()来试试优化的,但是好像没有用,因为FPV不属于payload,目前我就挂载了一个单云台相机,换句话说就是,payload.isDJIVideoStreamingChannelAvailable()永远返回的是flase? -->如果你只挂了一个CUS通道的相机,那么只可以获取到一个paylod,那么payload.isDJIVideoStreamingChannelAvailable()返回的就是false。FPV镜头在SDK内部无法识别成camera,它无法拍照和录制,只可以获取视频流
    0
    Comment actions Permalink

Please sign in to leave a comment.