RK平台视频播放器无法浮窗播放

最近发现RK平台某些机型的视频播放器在播放视频时,如果点击浮窗播放的按钮播放就会停止。抓Log提示:

ActivityManager: Unable to start service Intent {
act=com.rk.app.mediafloat.CUSTOM_ACTION
pkg=com.android.rk.mediafloat
cmp=com.android.rk.mediafloat/.MediaFloatService 
(has extras) } U=0: not found

视频播放器是集成的 vendor/rockchip/common/apps/RkVideoPlayer/RkVideoPlayer.apk。 Log提示是找不到“com.android.rk.mediafloat”,是否是应用本身的问题呢?因为只是个别机型有这个问题,所以还是要查一下系统代码。
经对比发现出问题的机型改过安全证书,把证书的修改 revert 之后,就可以浮窗播放了。看了一下RkVideoPlayer.apk 的编译文件,发现签名是 PRESIGNED,于是改成了 platform。但试了还是不行。问了一下同事,同事怀疑这个“com.android.rk.mediafloat” 并不是RkVideoPlayer.apk 里的。通过指令查一下RkVideoPlayer.apk包含哪些action。
首先列出所有包名:

#pm list package -f

由输出可知RkVideoPlayer.apk 的包名是 android.rk.RockVideoPlayer

dumpsys package android.rk.RockVideoPlayer

发现它并不包含 “com.rk.app.mediafloat.CUSTOM_ACTION”。而且第一个指令输出所有包名时也不包含 com.android.rk.mediafloat 。抓取刷机后第一次开机log,证明这个 package 确实没有安装成功:

PackageManager: Failed to parse 
/system/app/MediaFloat: Signature mismatch for shared user: 
SharedUserSetting{87a8a26 android.uid.system/1000}

咳,原来是MediaFloat.apk 的签名有问题。将其编译文件中的 PRESIGNED 改成 platform,问题解决了。
后知后觉,当发现是签名导致的问题时,应该抓系统Log看一下的,就不用绕这么一大圈了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RK3399平台上,您可以使用V4L2框架来获取视频数据。以下是获取视频数据的基本步骤: 1. 打开视频设备 ``` fd = open("/dev/video0", O_RDWR); if (fd == -1) { perror("Failed to open video device"); return -1; } ``` 2. 查询视频设备的功能和参数 ``` struct v4l2_capability cap; if (ioctl(fd, VIDIOC_QUERYCAP, &cap) == -1) { perror("Failed to query video device capabilities"); return -1; } ``` 3. 设置视频格式和参数 ``` struct v4l2_format fmt; memset(&fmt, 0, sizeof(fmt)); fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; fmt.fmt.pix.width = WIDTH; fmt.fmt.pix.height = HEIGHT; fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV; if (ioctl(fd, VIDIOC_S_FMT, &fmt) == -1) { perror("Failed to set video format"); return -1; } ``` 4. 分配视频帧缓冲区 ``` struct v4l2_requestbuffers req; memset(&req, 0, sizeof(req)); req.count = NUM_BUFFERS; req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; req.memory = V4L2_MEMORY_MMAP; if (ioctl(fd, VIDIOC_REQBUFS, &req) == -1) { perror("Failed to request video buffers"); return -1; } struct buffer *buffers = calloc(req.count, sizeof(*buffers)); if (!buffers) { perror("Failed to allocate video buffers"); return -1; } for (int i = 0; i < req.count; i++) { struct v4l2_buffer buf; memset(&buf, 0, sizeof(buf)); buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; buf.memory = V4L2_MEMORY_MMAP; buf.index = i; if (ioctl(fd, VIDIOC_QUERYBUF, &buf) == -1) { perror("Failed to query video buffer"); return -1; } buffers[i].length = buf.length; buffers[i].start = mmap(NULL, buf.length, PROT_READ | PROT_WRITE, MAP_SHARED, fd, buf.m.offset); if (buffers[i].start == MAP_FAILED) { perror("Failed to map video buffer"); return -1; } if (ioctl(fd, VIDIOC_QBUF, &buf) == -1) { perror("Failed to queue video buffer"); return -1; } } ``` 5. 开始视频采集 ``` enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE; if (ioctl(fd, VIDIOC_STREAMON, &type) == -1) { perror("Failed to start video stream"); return -1; } ``` 6. 读取视频帧数据 ``` struct v4l2_buffer buf; memset(&buf, 0, sizeof(buf)); buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; buf.memory = V4L2_MEMORY_MMAP; if (ioctl(fd, VIDIOC_DQBUF, &buf) == -1) { perror("Failed to dequeue video buffer"); return -1; } // Process video frame data here process_frame(buffers[buf.index].start, buffers[buf.index].length); if (ioctl(fd, VIDIOC_QBUF, &buf) == -1) { perror("Failed to queue video buffer"); return -1; } ``` 7. 停止视频采集和释放资源 ``` if (ioctl(fd, VIDIOC_STREAMOFF, &type) == -1) { perror("Failed to stop video stream"); return -1; } for (int i = 0; i < req.count; i++) { munmap(buffers[i].start, buffers[i].length); } free(buffers); close(fd); ``` 请注意,上述代码仅供参考,具体实现可能因设备驱动程序的不同而有所不同。您可以根据自己的需求和设备的驱动程序来进行适当的修改和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值