大佬教程收集整理的这篇文章主要介绍了DJI 移动 SDK Mavic 2 Pro - 直播 4k,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我是 stackoverflow 的新手,希望你们中有人能帮助我。
我使用 DJI 移动 SDK 开发了一个应用程序,并实现了直播。问题是直播的分辨率不是 4k,我需要 4k。我认为无人机为实时预览提供了辅助流。是否可以将次要流更改为具有 4k 分辨率的主要流?如果有可能,我该怎么做?或者是否可以简单地提高直播流/次流的分辨率?
这是我目前的实现:
用于实时流预览的表面纹理元素的初始化:
SurfaCETextureListener surfaCETextureListener = new SurfaCETextureListener(getApplicationContext());
this.vIDeoStreamPrevIEwTtVIEw.setSurfaCETextureListener(surfaCETextureListener);
这是我的听众:
public class SurfaCETextureListener implements TextureVIEw.SurfaCETextureListener {
private final Context context;
public SurfaCETextureListener(Context context) {
this.context = context;
}
@OverrIDe
public voID onSurfaCETextureAvailable(SurfaCETexture surface,int wIDth,int height) {
if (DroneControl.getCodecManager() == null) {
DroneControl.setCodecManager(new DJICodecManager(this.context,surface,wIDth,height));
DroneControl.getCodecManager().resetKeyFrame();
DroneControl.getCodecManager().enabledYuvData(true);
DroneControl.getCodecManager().setYuvDataCallBACk(new liveStreamDataCallBACk(this.context));
}
}
@OverrIDe
public voID onSurfaCETextureSizeChanged(SurfaCETexture surface,int height) {
}
@OverrIDe
public Boolean onSurfaCETextureDestroyed(SurfaCETexture surfacE) {
if (DroneControl.getCodecManager() != null) {
DroneControl.getCodecManager().cleanSurface();
DroneControl.setCodecManager(null);
}
return false;
}
@OverrIDe
public voID onSurfaCETextureupdated(SurfaCETexture surfacE) {
}
}
这是我的回调函数:
public class liveStreamDataCallBACk implements Base,DJICodecManager.YuvDataCallBACk {
private final Context context;
private final long lastupdate;
public liveStreamDataCallBACk(Context context) {
this.context = context;
this.lastupdate = System.currentTimeMillis();
}
@OverrIDe
public voID onYuvDataReceived(MediaFormat format,final ByteBuffer yuvFrame,int dataSize,final int wIDth,final int height) {
long differenceInMillis = System.currentTimeMillis() - this.lastupdate;
if (differenceInMillis > SCREEN_SHOT_PERIOD && yuvFrame != null) {
final byte[] bytes = new byte[dataSize];
yuvFrame.get(bytes);
newSaveYuvDataToJPEG(bytes,height);
}
}
private voID newSaveYuvDataToJPEG(byte[] yuvFrame,int height) {
if (yuvFrame.length < wIDth * height) {
return;
}
int length = wIDth * height;
byte[] u = new byte[wIDth * height / 4];
byte[] v = new byte[wIDth * height / 4];
for (int i = 0; i < u.length; i++) {
u[i] = yuvFrame[length + i];
v[i] = yuvFrame[length + u.length + i];
}
for (int i = 0; i < u.length; i++) {
yuvFrame[length + 2 * i] = v[i];
yuvFrame[length + 2 * i + 1] = u[i];
}
screenShot(yuvFrame,height);
}
private voID screenShot(byte[] buf,int height) {
ByteArrayOutputStream bOutput = new ByteArrayOutputStream();
YuvImage yuvImage = new YuvImage(buf,ImageFormat.nv21,height,null);
yuvImage.compresstoJpeg(new Rect(0,height),100,bOutput);
inserTintoDB(Base64.getEncoder().encodetoString(bOutput.toByteArray()));
}
private voID inserTintoDB(String base64EncodedContent) {
//only a limit of images will be saved insIDe the DB to avoID using too much space!
DatabaseUtil.reduCETableContentToMaxContentIfNecessary(this.context,ScreenShotModel.ScreenShotEntry.table_name,MAX_KEEP_COUNT_FOR_liVE_STREAM_SCREEN_SHOTS);
Date Now = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT_FOR_LOGGING,Locale.GERMANY);
sqliteDatabase db = DroneControl.getDbWriteAccess(this.context);
//create a new map of values,where column names are the keys
ContentValues values = new ContentValues();
values.put(ScreenShotModel.ScreenShotEntry.columN_name_DATA,base64EncodedContent);
values.put(ScreenShotModel.ScreenShotEntry.columN_name_CREATED,dateFormat.format(Now));
db.insert(ScreenShotModel.ScreenShotEntry.table_name,null,values);
}
}
希望有人能解决我的问题。
非常感谢!
最好的问候
做不到。 1080p 是最大的,ocusync 不能做任何更高的。带宽不够高,无人机硬件不支持。
反正我不知道该怎么做。 你唯一能做的就是拍摄一张静止图像并下载它,当然它会很慢,但可以用于图像识别。你没有说你打算用它做什么,但因为你似乎在看框架,这可能是一个(缓慢的)解决方案。
来自 DJI 网站: 同步 作为 Lightbridge 家族的一员,DJI 新开发的 OcuSync 传输系统在所有传输速度下的性能都远优于 Wi-Fi 传输。 OcuSync 还采用了更有效的数字压缩和通道传输技术,使其即使在无线电干扰强烈的环境中也能可靠地传输高清视频。与传统的模拟传输相比,OcuSync 可以以 720p 和 1080p 传输视频 - 相当于提高 4-10 倍的质量,没有色偏、静态干扰、闪烁或与模拟传输相关的其他问题。即使使用相同数量的无线电传输功率,OcuSync 在 4.1 英里(7 公里)处也比模拟传输更远
,非常感谢您的回答和帮助!
实际上,我尝试先捕获 4k 图像并传输它。正如您已经说过的,我尝试使用帧进行对象检测,并且我需要获得最佳性能。捕获图像并传输图像非常耗时。我需要大约 1.5 秒的时间来捕获和保存图像,再需要 3 秒的时间来传输它,对我来说最大的惊喜是读取 SD 卡以找到最新的图像需要将近 11 秒(我尝试了最大级别为 10 的不同 SD 卡) )。总之,一张图片的整个过程需要 15.5 秒,这对我来说太长了......
然后我想我可以通过直播来做到这一点。直播的整个过程需要 500 毫秒,这对我的项目来说是可以接受的值。很发人深省,似乎不可能……
也许还有另一个机会可以非常快地从无人机传输图像?
,我从直播中获得剧照,但以另一种方式。 我使用 fpv-widget(实时流显示在设备上),并直接从小部件读取 bmp。 这样你就不用在java中处理这么多数据了。
我什至是从 python 中完成的,并且由于一些怪癖,我在没有任何编组的情况下将它放入了 opencv2。可以在 python 中读出 100 帧/秒,所以 java 至少应该那么快。 你可能会重新考虑你的做法。尽量避免重新打包图像数据。 它仍然只有1080,但我必须说它的质量非常好。
<dji.ux.widget.FPVWidget
android:id="@+id/fpv_widget"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerInParent="true"
custom:sourceCameraNameVisibility="true" />
public Bitmap getFrameBitmap() {
fpvWidget = findViewById(R.id.fpv_widget);
return fpvWidget.getBitmap();
}
以上是大佬教程为你收集整理的DJI 移动 SDK Mavic 2 Pro - 直播 4k全部内容,希望文章能够帮你解决DJI 移动 SDK Mavic 2 Pro - 直播 4k所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。