回放下载

2023-07-18
暂无评分

实现回放下载功能

请开发者根据选用的开发平台以及行业应用实际的使用需求,按照T_DjiCameraMediaDownloadPlaybackHandler结构体构造实现下载媒体文件原始数据创建/销毁缩略图创建/下载缩略图等回访下载功能的函数,并将函数注册到PSDK 中指定的接口后,用户通过使用DJI Pilot 或基于MSDK 开发的移动端App 能够从基于PSDK 开发的相机类负载设备上下载媒体文件或实现视频流回放功能。

    // 实现获取媒体文件信息的功能
    s_psdkCameraMedia.GetMediaFileDir = GetMediaFileDir;
    s_psdkCameraMedia.GetMediaFileOriginInfo = GetMediaFileOriginInfo;
    s_psdkCameraMedia.GetMediaFileOriginData = GetMediaFileOriginData;
    // 实现获取媒体文件缩略图的功能
    s_psdkCameraMedia.CreateMediaFileThumbNail = CreateMediaFileThumbNail;
    s_psdkCameraMedia.GetMediaFileThumbNailInfo = GetMediaFileThumbNailInfo;
    s_psdkCameraMedia.GetMediaFileThumbNailData = GetMediaFileThumbNailData;
    s_psdkCameraMedia.DestroyMediaFileThumbNail = DestroyMediaFileThumbNail;
    // 实现获取媒体文件截屏图的功能
    s_psdkCameraMedia.CreateMediaFileScreenNail = CreateMediaFileScreenNail;
    s_psdkCameraMedia.GetMediaFileScreenNailInfo = GetMediaFileScreenNailInfo;
    s_psdkCameraMedia.GetMediaFileScreenNailData = GetMediaFileScreenNailData;
    s_psdkCameraMedia.DestroyMediaFileScreenNail = DestroyMediaFileScreenNail;
    // 实现删除媒体文件的功能
    s_psdkCameraMedia.DeleteMediaFile = DeleteMediaFile;
    // 实现控制媒体文件回放的功能
    s_psdkCameraMedia.SetMediaPlaybackFile = SetMediaPlaybackFile;
    s_psdkCameraMedia.StartMediaPlayback = StartMediaPlayback;
    s_psdkCameraMedia.StopMediaPlayback = StopMediaPlayback;
    s_psdkCameraMedia.PauseMediaPlayback = PauseMediaPlayback;
    s_psdkCameraMedia.SeekMediaPlayback = SeekMediaPlayback;
    s_psdkCameraMedia.GetMediaPlaybackStatus = GetMediaPlaybackStatus;
    // 实现下载媒体文件的功能
    s_psdkCameraMedia.StartDownloadNotification = StartDownloadNotification;
    s_psdkCameraMedia.StopDownloadNotification = StopDownloadNotification;

使用回放下载功能

注意

  • 请使用编解码工具FFmpeg 2.8.15open in new window 操作相机类负载设备中的文件并执行相应的编解码功能。使用ffmpeg -v可查看当前FFmpeg 的版本信息。
  • 仅基于Linux 开发的负载设备支持使用回放下载功能。

1. 配置网络参数

为确保用户能够处理在Linux 平台上开发的相机类负载设备中的媒体文件,请以手动的方式设置相机类负载设备的网络参数:

  • IP 地址:192.168.5.3
  • 网 关 :192.168.5.1
  • 子网掩码:255.255.255.0

IP 地址设置完成后,使用pingifconfig 命令查看相机类负载设备和无人机间的网络状态。

说明: 若使用虚拟机调试相机类负载设备,请将虚拟机网络适配器的模式设置为桥接模式,同时启用“复制物理网络连接状态”。

2. 注册回放下载中的功能

说明: 用户可根据实际的使用需要注册视频回放下载功能。

static T_DjiReturnCode StartMediaPlayback(void)
{
    T_DjiReturnCode returnCode;

    USER_LOG_INFO("start media playback");
    returnCode = DjiPlayback_StartPlay(&s_playbackInfo);
    if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
        USER_LOG_ERROR("start media playback status error, stat:0x%08llX", returnCode);
        return returnCode;
    }

    return returnCode;
}

static T_DjiReturnCode StopMediaPlayback(void)
{
    T_DjiReturnCode returnCode;

    USER_LOG_INFO("stop media playback");
    returnCode = DjiPlayback_StopPlay(&s_playbackInfo);
    if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
        USER_LOG_ERROR("stop media playback error, stat:0x%08llX", returnCode);
        return returnCode;
    }

    return returnCode;
}

static T_DjiReturnCode PauseMediaPlayback(void)
{
    T_DjiReturnCode returnCode;

    USER_LOG_INFO("pause media playback");
    returnCode = DjiPlayback_PausePlay(&s_playbackInfo);
    if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
        USER_LOG_ERROR("pause media playback error, stat:0x%08llX", returnCode);
        return returnCode;
    }

    return returnCode;
}

static T_DjiReturnCode SeekMediaPlayback(uint32_t playbackPosition)
{
    T_DjiReturnCode returnCode;

    USER_LOG_INFO("seek media playback:%d", playbackPosition);
    returnCode = DjiPlayback_SeekPlay(&s_playbackInfo, playbackPosition);
    if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
        USER_LOG_ERROR("seek media playback error, stat:0x%08llX", returnCode);
        return returnCode;
    }

    return returnCode;
}

获取文件列表

1. 获取媒体文件的路径

使用PSDK 开发的相机类负载设备通过GetMediaFileDir接口获取用户指定的文件的地址,用户使用DJI Pilot 以及基于MSDK 开发的移动端App 能够获取指定的媒体文件所在的路径。

说明: 媒体文件的默认路径为camera_media_emu/media_file,用户可根据实际的使用需要,更改媒体文件所在的路径。

static T_DjiReturnCode GetMediaFileDir(char *dirPath)
{
    T_DjiReturnCode returnCode;
    char curFileDirPath[DJI_FILE_PATH_SIZE_MAX];
    char tempPath[DJI_FILE_PATH_SIZE_MAX];

    returnCode = DjiUserUtil_GetCurrentFileDirPath(__FILE__, DJI_FILE_PATH_SIZE_MAX, curFileDirPath);
    if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
        USER_LOG_ERROR("Get file current path error, stat = 0x%08llX", returnCode);
        return returnCode;
    }

    snprintf(dirPath, DJI_FILE_PATH_SIZE_MAX, "%smedia_file", curFileDirPath);

    return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
2. 获取媒体文件的列表

指定媒体文件所在的路径后,基于MSDK 开发的移动端App 将向相机类负载设备发送获取文件信息的命令。

  • 基于PSDK 开发的负载设备通过调用PSDK 中获取媒体文件信息的接口,能够获取负载设备中媒体文件的信息,如文件的名称、路径和大小等。
  • 相机类负载设备通过FFmpeg 命令,能够获取媒体文件的长度、帧率和分辨率。
T_DjiReturnCode DjiTest_CameraMediaGetFileInfo(const char *filePath, T_DjiCameraMediaFileInfo *fileInfo)
{
    T_DjiReturnCode returnCode;
    T_DjiMediaFileHandle mediaFileHandle;

    returnCode = DjiMediaFile_CreateHandle(filePath, &mediaFileHandle);
    if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
        USER_LOG_ERROR("Media file create handle error stat:0x%08llX", returnCode);
        return returnCode;
    }

    returnCode = DjiMediaFile_GetMediaFileType(mediaFileHandle, &fileInfo->type);
    if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
        USER_LOG_ERROR("Media file get type error stat:0x%08llX", returnCode);
        goto out;
    }

    returnCode = DjiMediaFile_GetMediaFileAttr(mediaFileHandle, &fileInfo->mediaFileAttr);
    if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
        USER_LOG_ERROR("Media file get attr error stat:0x%08llX", returnCode);
        goto out;
    }

    returnCode = DjiMediaFile_GetFileSizeOrg(mediaFileHandle, &fileInfo->fileSize);
    if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
        USER_LOG_ERROR("Media file get size error stat:0x%08llX", returnCode);
        goto out;
    }

out:
    returnCode = DjiMediaFile_DestroyHandle(mediaFileHandle);
    if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
        USER_LOG_ERROR("Media file destroy handle error stat:0x%08llX", returnCode);
        return returnCode;
    }

    return returnCode;
}
3. 获取媒体文件的原始数据

使用PSDK 开发的相机类负载设备通过GetMediaFileOriginData接口,获取负载设备上的媒体文件的原始数据,用户使用DJI Pilot 以及基于MSDK 开发的移动端App 能够获取指定的媒体文件所在的路径。

static T_DjiReturnCode GetMediaFileOriginData(const char *filePath, uint32_t offset, uint32_t length, uint8_t *data)
{
    T_DjiReturnCode returnCode;
    uint16_t realLen = 0;
    T_DjiMediaFileHandle mediaFileHandle;

    returnCode = DjiMediaFile_CreateHandle(filePath, &mediaFileHandle);
    if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
        USER_LOG_ERROR("Media file create handle error stat:0x%08llX", returnCode);
        return returnCode;
    }

    returnCode = DjiMediaFile_GetDataOrg(mediaFileHandle, offset, length, data, &realLen);
    if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
        USER_LOG_ERROR("Media file get data error stat:0x%08llX", returnCode);
        return returnCode;
    }

    returnCode = DjiMediaFile_DestroyHandle(mediaFileHandle);
    if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
        USER_LOG_ERROR("Media file destroy handle error stat:0x%08llX", returnCode);
        return returnCode;
    }

    return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

说明

  • 获取媒体文件列表的功能只能获取到媒体文件的原始文件和缩略图。
  • 实现获取媒体文件列表的功能后,用户能够获得指定文件的截屏图。
  • 用户通过下载功能能够得到指定媒体文件的原始文件。

创建缩略图

1. 获取指定对象的路径并创建缩略图

使用PSDK 开发的相机类负载设备通过CreateMediaFileThumbNail接口,获取用户指定媒体文件的路径并创建缩略图,用户使用DJI Pilot 以及基于MSDK 开发的移动端App 能够向负载设备发送创建指定媒体文件的缩略图的命令。

static T_DjiReturnCode CreateMediaFileThumbNail(const char *filePath)
{
    T_DjiReturnCode returnCode;

    returnCode = DjiMediaFile_CreateHandle(filePath, &s_mediaFileThumbNailHandle);
    if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
        USER_LOG_ERROR("Media file create handle error stat:0x%08llX", returnCode);
        return returnCode;
    }

    returnCode = DjiMediaFile_CreateThm(s_mediaFileThumbNailHandle);
    if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
        USER_LOG_ERROR("Media file create thumb nail error stat:0x%08llX", returnCode);
        return returnCode;
    }

    return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
2. 获取缩略图的信息

使用PSDK 开发的相机类负载设备通过GetMediaFileThumbNailInfo接口,获取指定媒体文件的缩略图信息,用户使用DJI Pilot 以及基于MSDK 开发的移动端App 能够向负载设备发送获取指定媒体文件缩略图信息的命令。

static T_DjiReturnCode GetMediaFileThumbNailInfo(const char *filePath, T_DjiCameraMediaFileInfo *fileInfo)
{
    T_DjiReturnCode returnCode;

    USER_UTIL_UNUSED(filePath);

    if (s_mediaFileThumbNailHandle == NULL) {
        USER_LOG_ERROR("Media file thumb nail handle null error");
        return DJI_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
    }

    returnCode = DjiMediaFile_GetMediaFileType(s_mediaFileThumbNailHandle, &fileInfo->type);
    if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
        USER_LOG_ERROR("Media file get type error stat:0x%08llX", returnCode);
        return returnCode;
    }

    returnCode = DjiMediaFile_GetMediaFileAttr(s_mediaFileThumbNailHandle, &fileInfo->mediaFileAttr);
    if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
        USER_LOG_ERROR("Media file get attr error stat:0x%08llX", returnCode);
        return returnCode;
    }

    returnCode = DjiMediaFile_GetFileSizeThm(s_mediaFileThumbNailHandle, &fileInfo->fileSize);
    if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
        USER_LOG_ERROR("Media file get size error stat:0x%08llX", returnCode);
        return returnCode;
    }

    return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}0
3. 获取缩略图

使用PSDK 开发的相机类负载设备通过GetMediaFileThumbNailData接口,获取指定媒体文件的缩略图,用户使用DJI Pilot 以及基于MSDK 开发的移动端App 能够向负载设备发送获取指定媒体文件缩略图的命令,并获得指定的缩略图。

static T_DjiReturnCode GetMediaFileThumbNailData(const char *filePath, uint32_t offset, uint32_t length, uint8_t *data)
{
    T_DjiReturnCode returnCode;
    uint16_t realLen = 0;

    USER_UTIL_UNUSED(filePath);

    if (s_mediaFileThumbNailHandle == NULL) {
        USER_LOG_ERROR("Media file thumb nail handle null error");
        return DJI_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
    }

    returnCode = DjiMediaFile_GetDataThm(s_mediaFileThumbNailHandle, offset, length, data, &realLen);
    if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
        USER_LOG_ERROR("Media file get data error stat:0x%08llX", returnCode);
        return returnCode;
    }

    return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
4. 销毁缩略图

使用PSDK 开发的相机类负载设备通过DestroyMediaFileThumbNail接口,销毁负载设备上生成的缩略图,用户使用DJI Pilot 以及基于MSDK 开发的移动端App 能够向负载设备发送删除指定媒体文件缩略图的命令。

说明: DJI Pilot 及基于MSDK 开发的移动端App 接收到相机类负载设备上的缩略图后,将缓存在APP 本地。

static T_DjiReturnCode DestroyMediaFileThumbNail(const char *filePath)
{
    T_DjiReturnCode returnCode;

    USER_UTIL_UNUSED(filePath);

    if (s_mediaFileThumbNailHandle == NULL) {
        USER_LOG_ERROR("Media file thumb nail handle null error");
        return DJI_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
    }

    returnCode = DjiMediaFile_DestoryThm(s_mediaFileThumbNailHandle);
    if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
        USER_LOG_ERROR("Media file destroy thumb nail error stat:0x%08llX", returnCode);
        return returnCode;
    }

    returnCode = DjiMediaFile_DestroyHandle(s_mediaFileThumbNailHandle);
    if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
        USER_LOG_ERROR("Media file destroy handle error stat:0x%08llX", returnCode);
        return returnCode;
    }

    return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

创建截屏图

1. 获取指定对象的路径并创建截屏图

使用PSDK 开发的相机类负载设备通过CreateMediaFileScreenNail接口,获取用户指定媒体文件的路径并创建截屏图,用户使用DJI Pilot 以及基于MSDK 开发的移动端App 能够向负载设备发送创建指定媒体文件的截屏图的命令。

static T_DjiReturnCode CreateMediaFileScreenNail(const char *filePath)
{
    T_DjiReturnCode returnCode;

    returnCode = DjiMediaFile_CreateHandle(filePath, &s_mediaFileScreenNailHandle);
    if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
        USER_LOG_ERROR("Media file create handle error stat:0x%08llX", returnCode);
        return returnCode;
    }

    returnCode = DjiMediaFile_CreateScr(s_mediaFileScreenNailHandle);
    if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
        USER_LOG_ERROR("Media file create screen nail error stat:0x%08llX", returnCode);
        return returnCode;
    }

    return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
2. 获取截屏图的信息

使用PSDK 开发的相机类负载设备通过GetMediaFileScreenNailInfo接口,获取指定媒体文件的截屏图信息,用户使用DJI Pilot 以及基于MSDK 开发的移动端App 能够向负载设备发送获取指定媒体文件截屏图信息的命令。

static T_DjiReturnCode GetMediaFileScreenNailInfo(const char *filePath, T_DjiCameraMediaFileInfo *fileInfo)
{
    T_DjiReturnCode returnCode;

    USER_UTIL_UNUSED(filePath);

    if (s_mediaFileScreenNailHandle == NULL) {
        USER_LOG_ERROR("Media file screen nail handle null error");
        return DJI_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
    }

    returnCode = DjiMediaFile_GetMediaFileType(s_mediaFileScreenNailHandle, &fileInfo->type);
    if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
        USER_LOG_ERROR("Media file get type error stat:0x%08llX", returnCode);
        return returnCode;
    }

    returnCode = DjiMediaFile_GetMediaFileAttr(s_mediaFileScreenNailHandle, &fileInfo->mediaFileAttr);
    if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
        USER_LOG_ERROR("Media file get attr error stat:0x%08llX", returnCode);
        return returnCode;
    }

    returnCode = DjiMediaFile_GetFileSizeScr(s_mediaFileScreenNailHandle, &fileInfo->fileSize);
    if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
        USER_LOG_ERROR("Media file get size error stat:0x%08llX", returnCode);
        return returnCode;
    }

    return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
3. 获取截屏图

使用PSDK 开发的相机类负载设备通过GetMediaFileScreenNailData接口,获取指定媒体文件的截屏图,用户使用DJI Pilot 以及基于MSDK 开发的移动端App 能够向负载设备发送获取指定媒体文件截屏图的命令,并获得指定的截屏图。

static T_DjiReturnCode GetMediaFileScreenNailData(const char *filePath, uint32_t offset, uint32_t length,
                                                  uint8_t *data)
{
    T_DjiReturnCode returnCode;
    uint16_t realLen = 0;

    USER_UTIL_UNUSED(filePath);

    if (s_mediaFileScreenNailHandle == NULL) {
        USER_LOG_ERROR("Media file screen nail handle null error");
        return DJI_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
    }

    returnCode = DjiMediaFile_GetDataScr(s_mediaFileScreenNailHandle, offset, length, data, &realLen);
    if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
        USER_LOG_ERROR("Media file get size error stat:0x%08llX", returnCode);
        return returnCode;
    }

    return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

使用DJI Pilot 或基于MSDK 开发的移动端App 能够自动拉取相机类负载设备中/media_file目录下的媒体文件,显示媒体文件的名称和截屏图,点击后即可显示媒体文件的截屏图,如 图1.查看截屏图 所示 。

图1.查看截屏图

删除媒体文件

使用PSDK 开发的相机类负载设备通过DeleteMediaFile接口,删除负载设备上的媒体文件,用户使用DJI Pilot 以及基于MSDK 开发的移动端App 能够向负载设备发送删除媒体文件的命令。

static T_DjiReturnCode DeleteMediaFile(char *filePath)
{
    T_DjiReturnCode returnCode;

    USER_LOG_INFO("delete media file:%s", filePath);
    returnCode = DjiFile_Delete(filePath);
    if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
        USER_LOG_ERROR("Media file delete error stat:0x%08llX", returnCode);
        return returnCode;
    }

    return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

在媒体列表界面,选中需要删除的文件,点击删除按钮,可删除相机类负载设备中的媒体文件,如 图2.删除媒体文件 所示。

图2.删除媒体文件

实现媒体文件回放功能

说明

  • 使用PSDK 开发相机类负载设备控制程序的回放功能前,需要先实现获取负载设备文件列表的功能。
  • 使用PSDK 开发相机类负载设备的回放功能时,需要先获取媒体文件的路径,将指定的媒体文件转换为H.264 格式。
1. 指定媒体文件的路径

使用PSDK 开发的相机类负载设备通过SetMediaPlaybackFile接口,获取用户指定的媒体文件的路径,用户使用DJI Pilot 以及基于MSDK 开发的移动端App 能够向负载设备发送媒体文件所在的路径。

static T_DjiReturnCode SetMediaPlaybackFile(const char *filePath)
{
    USER_LOG_INFO("set media playback file:%s", filePath);
    T_DjiReturnCode returnCode;

    returnCode = DjiPlayback_StopPlay(&s_playbackInfo);
    if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
        return returnCode;
    }

    returnCode = DjiPlayback_SetPlayFile(&s_playbackInfo, filePath, 0);
    if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
        return returnCode;
    }

    returnCode = DjiPlayback_StartPlay(&s_playbackInfo);
    if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
        return returnCode;
    }

    return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
2. 格式转换

使用PSDK 开发的相机类负载设备通过DjiPlayback_VideoFileTranscode接口,将用户指定的媒体文件转换为H,264 格式的文件,用户使用DJI Pilot 以及基于MSDK 开发的移动端App 能够向负载设备发送转换媒体文件格式的指令,将指定的文件转为H.264 格式,同时获取转换后媒体文件的帧率、帧信息、总帧数等信息。

    // video send preprocess
        returnCode = DjiPlayback_VideoFileTranscode(videoFilePath, "h264", transcodedFilePath,
                                                    DJI_FILE_PATH_SIZE_MAX);
        if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
            USER_LOG_ERROR("transcode video file error: 0x%08llX.", returnCode);
            continue;
        }

        returnCode = DjiPlayback_GetFrameRateOfVideoFile(transcodedFilePath, &frameRate);
        if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
            USER_LOG_ERROR("get frame rate of video error: 0x%08llX.", returnCode);
            continue;
        }

        returnCode = DjiPlayback_GetFrameInfoOfVideoFile(transcodedFilePath, frameInfo, VIDEO_FRAME_MAX_COUNT,
                                                         &frameCount);
        if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
            USER_LOG_ERROR("get frame info of video error: 0x%08llX.", returnCode);
            continue;
        }

        returnCode = DjiPlayback_GetFrameNumberByTime(frameInfo, frameCount, &frameNumber,
                                                      startTimeMs);
        if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
            USER_LOG_ERROR("get start frame number error: 0x%08llX.", returnCode);
            continue;
        }
3. 发送媒体文件

使用PSDK 开发的相机类负载设备通过DjiPayloadCamera_SendVideoStream接口,将根据格式转换后的媒体文件的帧率、帧信息、总帧数等信息找到媒体文件的帧头,并按照指定的码率向DJI Pilot 或基于MSDK 开发的APP 发送媒体文件,用户使用DJI Pilot 以及基于MSDK 开发的移动端App 能够接收到负载设备发送的媒体文件。

说明: 有关实现视频流传输功能的详细说明和具体步骤请参见视频流传输open in new window

        lengthOfDataHaveBeenSent = 0;
        while (dataLength - lengthOfDataHaveBeenSent) {
            lengthOfDataToBeSent = USER_UTIL_MIN(DATA_SEND_FROM_VIDEO_STREAM_MAX_LEN,
                                                 dataLength - lengthOfDataHaveBeenSent);
            returnCode = DjiPayloadCamera_SendVideoStream((const uint8_t *) dataBuffer + lengthOfDataHaveBeenSent,
                                                          lengthOfDataToBeSent);
            if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
                USER_LOG_ERROR("send video stream error: 0x%08llX.", returnCode);
            }
            lengthOfDataHaveBeenSent += lengthOfDataToBeSent;
        }
4. 获取媒体文件的传输状态

使用PSDK 开发的相机类负载设备通过GetMediaPlaybackStatus接口,能够获取当前媒体文件的传输状态,用户使用DJI Pilot 或基于MSDK 开发的移动端App 能够获取到当前传输的媒体文件的状态信息。

static T_DjiReturnCode GetMediaPlaybackStatus(T_DjiCameraPlaybackStatus *status)
{
    T_DjiReturnCode returnCode;

    returnCode = DjiPlayback_GetPlaybackStatus(&s_playbackInfo, status);
    if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
        USER_LOG_ERROR("get playback status error, stat:0x%08llX", returnCode);
        return returnCode;
    }

    status->videoPlayProcess = (uint8_t) (((float) s_playbackInfo.playPosMs / (float) s_playbackInfo.videoLengthMs) *
                                          100);

    USER_LOG_DEBUG("get media playback status %d %d %d %d", status->videoPlayProcess, status->playPosMs,
                   status->videoLengthMs, status->playbackMode);

    return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

使用DJI Pilot 或基于MSDK 开发的移动端App 在媒体列表界面,点击所需播放的视频文件,即可进入播放界面,通过按钮和进度条控件,播放视频或调整视频播放进度,如 图3.播放视频文件 所示;在媒体列表界面,选中指定的文件,点击下载按钮,即可下载相机类负载设备中的媒体文件,如 图4.媒体文件下载 所示。

图3.播放视频文件

图4.媒体文件下载

说明: 媒体文件的下载速度约为 300KB/s,受飞机工作环境影响实际下载速度可能会有差异。

若您对文档有意见或疑惑,点击可快速反馈,我们会与您联系。