android - 使用 Android Nougat 的共享内存进行媒体解码
问题描述
我正在将我的基于 Android AOSP 的发行版从 Android K 移植到 Android N。它包括一个可以解码 DVD 字幕的媒体播放器的修改版本。媒体播放器的架构在这两个版本之间发生了很大变化。特别是,它现在分为 3 个进程(请参阅https://source.android.com/devices/media/framework-hardening)。
因此,我试图使用 Shared Memory 使MediaCodecService将解码的位图字幕发送到MediaServer。我修改了之前由MediaCodecService创建的结构的内容,并在解码的位图字幕中添加了subtitle_fd属性,文件描述符。当MediaServer的Nuplayer接收到要渲染的消息时,代码会尝试映射上述文件描述符。
不幸的是,调用::mmap的结果总是MAP_FAILED。
你知道我错过了什么吗?
MediaCodecService 部分的代码
AVSubtitleRect *rect = sub->rects[0]; size_t len = sizeof(*rect); int fd = ashmem_create_region("subtitle rect", len); ashmem_set_prot_region(fd, PROT_READ | PROT_WRITE); void* ptr = ::mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if (ptr == MAP_FAILED) { ALOGI("%s[%d] dvb ptr == MAP_FAILED", __FUNCTION__, __LINE__); } else { ALOGI("Success creating FD with value %d", fd); } memcpy(ptr, rect, len); sub->subtitle_fd = fd; sub->subtitle_size = len;
MediaServer 部分的代码
int fd = mSubtitle->subtitle_fd; size_t len = mSubtitle->subtitle_size; ALOGI("Trying to map shared memory with FD = %d", fd); void* ptr = ::mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if (ptr == MAP_FAILED) { ALOGI("Subtitle mmap ptr==MAP_FAILED %s", strerror(errno)); } else { ALOGI("Subtitle get ptr %p", ptr); } AVSubtitleRect *rect = (AVSubtitleRect *)ptr;
太感谢了 !
解决方案
推荐阅读
- python - 如何将列表粘贴到多索引数据框中?
- ios - 防止自动布局拉伸自定义视图
- laravel - Laravel 处理仅由控制器抛出的错误
- node.js - 什么需要('..'); 在 Node.js 中
- node.js - 如何在heroku上的node.js中远程保留spotify刷新令牌
- python - Google.Ads.GoogleAds.Examples 返回 Deadline Exceeded
- javascript - 如何将 HTML 插入 getDocumentByID.innerHTML 函数
- jquery - 如果价格值小于 #2,jQuery 隐藏 div
- vue.js - 启动vue应用程序时“无法读取未定义的属性'升级'”
- c++ - 如何将 C++ 代码中的枚举转换为 C