wangwei1237 / CameraHook

102 stars 31 forks source link

Android version #2

Closed w2016561536 closed 2 years ago

w2016561536 commented 2 years ago

I have learned your hook method . But I have a question why it can only support to Android 4.4 . When I test it on Android 11 .It throws an illeaglestateexception when try to prepare the media . What leads to it?? Also I have a universal hook method and don't need find app's class.

wangwei1237 commented 2 years ago

Can you provide more detail information of the illegal state exception? Is the Xposed version you used wrong? From the information of https://repo.xposed.info/module/de.robv.android.xposed.installer, For Android 5.0 or higher (Lollipop/Marshmallow), these versions don't work! Use this instead: http://forum.xda-developers.com/showthread.php?t=3034811

w2016561536 commented 2 years ago

Xposed log : 2021-08-10 04:20:45.045 E/com.alibaba.android.rimet(11357-29014): java.lang.IllegalStateException at android.media.MediaPlayer.setDataSource(Native Method) at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1335) at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1318) at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1269) at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1230) at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1195) at com.w2016.forcebehiendcamera.HookMain$1.beforeHookedMethod(HookMain.java:123) at de.robv.android.xposed.LspHooker.handleHookedMethod(Unknown Source:75) at LspHooker.setPreviewTexture(Unknown Source:11) at org.webrtc.mozi.Camera1Session.create(Camera1Session.java:84) at org.webrtc.mozi.Camera1Capturer.createCameraSession(Camera1Capturer.java:35) at org.webrtc.mozi.OwtVideoCapturer.createCameraSession(OwtVideoCapturer.java:128) at org.webrtc.mozi.CameraCapturer$6.run(CameraCapturer.java:391) at android.os.Handler.handleCallback(Handler.java:938) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:246) at android.os.HandlerThread.run(HandlerThread.java:67)

I am using LSPosed . I confirm that it supports Android 11 , I have successfully hooked previewTexture(it turns into empty) , but I can't display media on it . However it works on Android 4.4.4

w2016561536 commented 2 years ago

My code , which it doesn't need to appoint app's activity. https://github.com/w2016561536/CameraPreviewCustom

w2016561536 commented 2 years ago

可能是一个原因:由于我们两个人都想省内存,导致同一个mediaplayer在prepare之后却又setSurface,又setdatasource 这的确是违规操作

w2016561536 commented 2 years ago

一个新的问题出现了 我完善了那几个对象的释放与定义 这次设置视频源不报错了 但是同步报错了 触发的条件:同一个camera对象连续setSurfaceTexture两次被hook

w531982206 commented 2 years ago

一个新的问题出现了 我完善了那几个对象的释放与定义 这次设置视频源不报错了 但是同步报错了 触发的条件:同一个camera对象连续setSurfaceTexture两次被hook

XposedHelpers.findAndHookMethod(cameraclass, "setPreviewTexture", android.graphics.SurfaceTexture.class, new XC_MethodHook() {

因为您是这样hook的, 每次执行setPreviewTexture都会被调用

w2016561536 commented 2 years ago

一个新的问题出现了 我完善了那几个对象的释放与定义 这次设置视频源不报错了 但是同步报错了 触发的条件:同一个camera对象连续setSurfaceTexture两次被hook

XposedHelpers.findAndHookMethod(cameraclass, "setPreviewTexture", android.graphics.SurfaceTexture.class, new XC_MethodHook() {

因为您是这样hook的, 每次执行setPreviewTexture都会被调用

感谢您的建议和启发,我已经更新了仓库,解决了此问题

w2016561536 commented 2 years ago

现在又出现一个问题,很多程序的摄像头回调数据是在onPreviewFrame那里得到的,而不是从previewTexture,我现在能HOOK回调函数,但无法处理data字节数组(无法确定分辨率,无法转换/组装YUV数据),望得到您的帮助。

w531982206 commented 2 years ago

现在又出现一个问题,很多程序的摄像头回调数据是在onPreviewFrame那里得到的,而不是从previewTexture,我现在能HOOK回调函数,但无法处理data字节数组(无法确定分辨率,无法转换/组装YUV数据),望得到您的帮助。

hook拿到camera对象,通过getParameters()获取camera信息,将视频源根据获取到的分辨率信息转为对应的NV21(可使用MediaCodec)

w2016561536 commented 2 years ago

在我查询资料后,发现大多数MediaCodec是从h264视频或者camera获取数据,请问能否从Surface或者mediaplayer获取指定分辨率的YUV420p数据呢,我很想让预览和onPreviewFrame同步,有时候可能会插入m3u8数据,谢谢。

w531982206 commented 2 years ago

在我查询资料后,发现大多数MediaCodec是从h264视频或者camera获取数据,请问能否从Surface或者mediaplayer获取指定分辨率的YUV420p数据呢,我很想让预览和onPreviewFrame同步,有时候可能会插入m3u8数据,谢谢。

主要思路就是MediaCodec将你要替换的视频分解成image再转化为nv21,通过hook赋值给onPreviewFrame,利用生产者消费者模式达到预览和onPreviewFrame同步。不建议从mediaplayer获取,多余的操作了,如果您有更好的思路欢迎投简历来我们公司随时分享~~

w2016561536 commented 2 years ago

我找到一个比较简单的方法,使用ImageReader,将mediaplayer播放到ImageReader的surface,然后在imagereader里取得回调,ImageReader可以指定宽高,可以指定输出格式,缩放算法什么的都省了,而且这还是全程硬解码

w2016561536 commented 2 years ago

在我查询资料后,发现大多数MediaCodec是从h264视频或者camera获取数据,请问能否从Surface或者mediaplayer获取指定分辨率的YUV420p数据呢,我很想让预览和onPreviewFrame同步,有时候可能会插入m3u8数据,谢谢。

主要思路就是MediaCodec将你要替换的视频分解成image再转化为nv21,通过hook赋值给onPreviewFrame,利用生产者消费者模式达到预览和onPreviewFrame同步。不建议从mediaplayer获取,多余的操作了,如果您有更好的思路欢迎投简历来我们公司随时分享~~

在我尝试之后,用imagereader在回调的时候,却出现闪退bug,而且catch不到错误 在HookMain.java:245行:‘ByteBuffer buffer = image.getPlanes()[0].getBuffer();’ 此处程序出现卡顿,之后闪退,却没有留下崩溃原因(有时候应用会重启) 工程换名字了:https://github.com/w2016561536/android_virtual_cam

w2016561536 commented 2 years ago

在我查询资料后,发现大多数MediaCodec是从h264视频或者camera获取数据,请问能否从Surface或者mediaplayer获取指定分辨率的YUV420p数据呢,我很想让预览和onPreviewFrame同步,有时候可能会插入m3u8数据,谢谢。

主要思路就是MediaCodec将你要替换的视频分解成image再转化为nv21,通过hook赋值给onPreviewFrame,利用生产者消费者模式达到预览和onPreviewFrame同步。不建议从mediaplayer获取,多余的操作了,如果您有更好的思路欢迎投简历来我们公司随时分享~~

还有一个问题,我将mediaplayer的surface设置为imagereader的surface,却发现mediaplayer在播放之后只触发一次imagereader的回调。 我用mediaplayer的原因是不想处理复杂的视频类型(比如说直播用的m3u8,还要动态加载,分段请求),不知您是否有何高见解决这些问题

w2016561536 commented 2 years ago

在我查询资料后,发现大多数MediaCodec是从h264视频或者camera获取数据,请问能否从Surface或者mediaplayer获取指定分辨率的YUV420p数据呢,我很想让预览和onPreviewFrame同步,有时候可能会插入m3u8数据,谢谢。

主要思路就是MediaCodec将你要替换的视频分解成image再转化为nv21,通过hook赋值给onPreviewFrame,利用生产者消费者模式达到预览和onPreviewFrame同步。不建议从mediaplayer获取,多余的操作了,如果您有更好的思路欢迎投简历来我们公司随时分享~~

我使用Mediacodec对H264的mp4进行解码,但是出现了以下问题
1、mediadecodec效率过高,但是onpreviewframe调用频率与mediadecodec很难同步,导致视频播放飞快。
2、mediadecodec没有原生的循环方法,在解码完成的回调里重新创建解码器会卡一下。

请问这两个问题怎么解决??谢谢