请教:Android正播放视频时的解码输出流如何获取?
2014-10-19 21:56
1611 查看
============问题描述============
Android播放视频,经过解码器解码 获得数据流 再显示到屏幕上。请问这部分数据(解码器解码后的数据流)通过什么方法可以获取? 请教。。。 先谢谢啦
============解决方案1============
你是想录制视频?
============解决方案2============
引用 3 楼 yu8fei 的回复:
在播放一个视频文件的时候,拿到系统对这个视频文件解码后的数据流,也就是解码器的输出流
那你直接读这个文件流就可以了啊
============解决方案3============
引用 5 楼 yu8fei 的回复:
在播放一个视频文件的时候,拿到系统对这个视频文件解码后的数据流,也就是解码器的输出流
那你直接读这个文件流就可以了啊怎么直接读啊?这个数据流没有存成文件,
视频是你自己控制播放呢还是从播放器播放视频的时候截取视频流?
============解决方案4============
最好的应该是从display部分入手,重写一个surfaceview,把这个view传给mediaplayer去播放,这样数据到这个view里面,你先去记录,然后再发出去播放,不过效率上估计有点问题。
============解决方案5============
引用 8 楼 yu8fei 的回复:
在播放一个视频文件的时候,拿到系统对这个视频文件解码后的数据流,也就是解码器的输出流
那你直接读这个文件流就可以了啊怎么直接读啊?这个数据流没有存成文件,
视频是你自己控制播放呢还是从播放器播放视频的时候截取视频流?
这个应该是一样的,我自己控制 的话也是调用系统默认的MediaPlayer解码器, 就是“从播放器播放视频的时候截取视频流”要解码后数据流
没用过MediaPlayer,但是调用MediaPlayer的话,直接jni处理视频流并描绘图像了,我想应该是取不到了吧
============解决方案6============
video播放是在graphic层显示的才能抓,有的方案video直接硬件的layer显示的,这种就没辙了。
graphic层可以试下下面两个方法:
1,在native层调用mediaplayer,MediaPlayer::setVideoSurfaceTexture接口是传入一个IGraphicBufferProducer,自己建立一个bufferqueue传进去就可以了。
2,用virtual display试试看,建立一个虚拟的display。然后仿照surfaceview写一个新的view,把window建立在前面建立的virtual display上。这样输出的数据都在virtual display的buffer中。
============解决方案7============
引用 13 楼 yu8fei 的回复:
native调用应该是需要一些系统库,你直接抓一份google代码去编译就是了,就是怕有些权限问题。
第二个case在java都有借口,可以试试。
============解决方案8============
楼主,我也有这样的需求:视频播放过程中获得每一帧图片,将每一帧图片处理后再显示播放,并且需要将处理过后的每一帧重新生成一个视频文件,不知道有没有好的方法???
============解决方案9============
能获取到视频源,一切就都不是问题了
============解决方案10============
引用 16 楼 yu8fei 的回复:
可以先看下virtualdisplaytest.java里面是怎么用的……突然发现SurfaceView中没有Surface,这个window怎么搞
有的,SurfaceView.getHolder().getSurface()
============解决方案13============
引用 28 楼 yu8fei 的回复:
这样,你建立一个SurfaceTexture初始化后传给用这个texture构造一个LocalHolder出来,
然后Mediaplayer.setDisplay就传入LocalHolder对象。
============解决方案22============
引用 47 楼 YKDSea 的回复:
camera里面有个api,setPreviewTexture来接收surfacetexture,但是mediaplayer没有这样的api的。能使用SurfaceTexture代替SurfaceView来显示,播放电影应该就可以了吧,能做到吗这样?SurfaceTexture不会用也没有api,google打不开!!
下午看了下Surface的api,有个途径可以试下,写一个类似下面的class
这样,你建立一个SurfaceTexture初始化后传给用这个texture构造一个LocalHolder出来,
然后Mediaplayer.setDisplay就传入LocalHolder对象。这个API我知道,问题是播放不出来东西、
surfacetexture界面上肯定是看不到东西的,先setOnFrameAvailableListener()设置个listener看看有没有数据上来,要想看到,还要把texture再画出去。
============解决方案24============
不知道你是怎么理解的,onFrameAvailable是回调函数,有新数据来的时候,才会被调用,不是看调用的参数。
============解决方案25============
引用 54 楼 yu8fei 的回复:
到jni层去操作就好做了,surfaceTexture.java里面的mSurfaceTexture分别对应了GLConsumer。
新的frame来的时候,先调用SurfaceTexture.updateTexImage()更新一下buffer,然后GLConsumer.getCurrentBuffer()可以拿到GraphicBuffer了,GraphicBuffer.lock()又可以直接拿到指针了。要注意color format。
============解决方案26============
引用 57 楼 yu8fei 的回复:
到jni层去操作就好做了,surfaceTexture.java里面的mSurfaceTexture分别对应了GLConsumer。
新的frame来的时候,先调用SurfaceTexture.updateTexImage()更新一下buffer,然后GLConsumer.getCurrentBuffer()可以拿到GraphicBuffer了,GraphicBuffer.lock()又可以直接拿到指针了。要注意color format。不理解你这句话“surfaceTexture.java里面的mSurfaceTexture分别对应了GLConsumer”是什么意思?
ps:这些都是你现学的么?从哪儿学的哇怎么学这么快懂这么多…
写错了,应该是”surfaceTexture.java里面的成员mSurfaceTexture,他是int类型,实际是一个指向native层的GLConsumer对象的指针。“
这些在android代码里面都有的,不要光看api,往下看看实现。
============解决方案27============
引用 59 楼 yu8fei 的回复:
你看的哪个文件?我说的是class SurfaceTexture里面。
============解决方案28============
VideoSurfaceView这个是你自己写的吧?
我的意思是要对SurfaceTexture扩展一下,前面说的成员都是class SufaceTexture中的,你要拿的buffer就在class SurfaceTexture中。
============解决方案29============
引用 63 楼 yu8fei 的回复:
mSurfaceTexture是在jni里面赋值的,java层的确看不到什么东西。从Surface入手,我觉得是不好做的,surface是处于一个生产者的角色,SurfaceTexture才是消费者,你现在是要使用player生产出来的buffer,从SurfaceTexture这边入手更合适。
============解决方案30============
呵呵呵.....
一般android的显示一般有两层(或者两层以上), fb0, 和 fb1, fb1 在 fb0 的下面, fb1 显示软件的界面, fb0 平时一般是透明的, 在播放视频 的时候, 如果视频使用硬件解码, 解码后的 YUV 图像帧 直接 memcpy 到 fb0 的 framebuffer中, 这时候你就可以看到视频了, 中间不经过任何JAVA代码, 如果不是全屏, 那么fb0的只有视频区域的 alpha值 为 255, 其它区域为0, 使得后面的界面可以透上来...
你要抓 解码后的数据, 从GPU的驱动下手, HOOK一个接口出来可能有希望......
Android播放视频,经过解码器解码 获得数据流 再显示到屏幕上。请问这部分数据(解码器解码后的数据流)通过什么方法可以获取? 请教。。。 先谢谢啦
============解决方案1============
你是想录制视频?
============解决方案2============
引用 3 楼 yu8fei 的回复:
Quote: 引用 2 楼 sagittarius1988 的回复:
你是想录制视频?
不是,跟照相机录像机摄像机无关的。你是想录制视频?
在播放一个视频文件的时候,拿到系统对这个视频文件解码后的数据流,也就是解码器的输出流
那你直接读这个文件流就可以了啊
============解决方案3============
引用 5 楼 yu8fei 的回复:
Quote: 引用 4 楼 sagittarius1988 的回复:
Quote: 引用 3 楼 yu8fei 的回复:
Quote: 引用 2 楼 sagittarius1988 的回复:
你是想录制视频?
不是,跟照相机录像机摄像机无关的。Quote: 引用 3 楼 yu8fei 的回复:
Quote: 引用 2 楼 sagittarius1988 的回复:
你是想录制视频?
在播放一个视频文件的时候,拿到系统对这个视频文件解码后的数据流,也就是解码器的输出流
那你直接读这个文件流就可以了啊怎么直接读啊?这个数据流没有存成文件,
视频是你自己控制播放呢还是从播放器播放视频的时候截取视频流?
============解决方案4============
最好的应该是从display部分入手,重写一个surfaceview,把这个view传给mediaplayer去播放,这样数据到这个view里面,你先去记录,然后再发出去播放,不过效率上估计有点问题。
============解决方案5============
引用 8 楼 yu8fei 的回复:
Quote: 引用 6 楼 sagittarius1988 的回复:
Quote: 引用 5 楼 yu8fei 的回复:
Quote: 引用 4 楼 sagittarius1988 的回复:
Quote: 引用 3 楼 yu8fei 的回复:
Quote: 引用 2 楼 sagittarius1988 的回复:
你是想录制视频?
不是,跟照相机录像机摄像机无关的。Quote: 引用 5 楼 yu8fei 的回复:
Quote: 引用 4 楼 sagittarius1988 的回复:
Quote: 引用 3 楼 yu8fei 的回复:
Quote: 引用 2 楼 sagittarius1988 的回复:
你是想录制视频?
在播放一个视频文件的时候,拿到系统对这个视频文件解码后的数据流,也就是解码器的输出流
那你直接读这个文件流就可以了啊怎么直接读啊?这个数据流没有存成文件,
视频是你自己控制播放呢还是从播放器播放视频的时候截取视频流?
这个应该是一样的,我自己控制 的话也是调用系统默认的MediaPlayer解码器, 就是“从播放器播放视频的时候截取视频流”要解码后数据流
没用过MediaPlayer,但是调用MediaPlayer的话,直接jni处理视频流并描绘图像了,我想应该是取不到了吧
============解决方案6============
video播放是在graphic层显示的才能抓,有的方案video直接硬件的layer显示的,这种就没辙了。
graphic层可以试下下面两个方法:
1,在native层调用mediaplayer,MediaPlayer::setVideoSurfaceTexture接口是传入一个IGraphicBufferProducer,自己建立一个bufferqueue传进去就可以了。
2,用virtual display试试看,建立一个虚拟的display。然后仿照surfaceview写一个新的view,把window建立在前面建立的virtual display上。这样输出的数据都在virtual display的buffer中。
============解决方案7============
引用 13 楼 yu8fei 的回复:
Quote: 引用 12 楼 YKDSea 的回复:
video播放是在graphic层显示的才能抓,有的方案video直接硬件的layer显示的,这种就没辙了。
graphic层可以试下下面两个方法:
1,在native层调用mediaplayer,MediaPlayer::setVideoSurfaceTexture接口是传入一个IGraphicBufferProducer,自己建立一个bufferqueue传进去就可以了。
2,用virtual display试试看,建立一个虚拟的display。然后仿照surfaceview写一个新的view,把window建立在前面建立的virtual display上。这样输出的数据都在virtual display的buffer中。
在Android4.2/4.4源码上作业应该不存在什么方案吧。。。native层调用是要引入系统库么,需要单独提出来?video播放是在graphic层显示的才能抓,有的方案video直接硬件的layer显示的,这种就没辙了。
graphic层可以试下下面两个方法:
1,在native层调用mediaplayer,MediaPlayer::setVideoSurfaceTexture接口是传入一个IGraphicBufferProducer,自己建立一个bufferqueue传进去就可以了。
2,用virtual display试试看,建立一个虚拟的display。然后仿照surfaceview写一个新的view,把window建立在前面建立的virtual display上。这样输出的数据都在virtual display的buffer中。
native调用应该是需要一些系统库,你直接抓一份google代码去编译就是了,就是怕有些权限问题。
第二个case在java都有借口,可以试试。
============解决方案8============
楼主,我也有这样的需求:视频播放过程中获得每一帧图片,将每一帧图片处理后再显示播放,并且需要将处理过后的每一帧重新生成一个视频文件,不知道有没有好的方法???
============解决方案9============
能获取到视频源,一切就都不是问题了
============解决方案10============
引用 16 楼 yu8fei 的回复:
Quote: 引用 12 楼 YKDSea 的回复:
video播放是在graphic层显示的才能抓,有的方案video直接硬件的layer显示的,这种就没辙了。
graphic层可以试下下面两个方法:
1,在native层调用mediaplayer,MediaPlayer::setVideoSurfaceTexture接口是传入一个IGraphicBufferProducer,自己建立一个bufferqueue传进去就可以了。
2,用virtual display试试看,建立一个虚拟的display。然后仿照surfaceview写一个新的view,把window建立在前面建立的virtual display上。这样输出的数据都在virtual display的buffer中。
video播放是在graphic层显示的才能抓,有的方案video直接硬件的layer显示的,这种就没辙了。
graphic层可以试下下面两个方法:
1,在native层调用mediaplayer,MediaPlayer::setVideoSurfaceTexture接口是传入一个IGraphicBufferProducer,自己建立一个bufferqueue传进去就可以了。
2,用virtual display试试看,建立一个虚拟的display。然后仿照surfaceview写一个新的view,把window建立在前面建立的virtual display上。这样输出的数据都在virtual display的buffer中。
这是VirtualDisplay,内容好少啊,能用吗,不知道怎么用诶? 可以先看下virtualdisplaytest.java里面是怎么用的 ============解决方案11============ 在解码之后 和 往显示设备上送 之间可以截获这块内存。 前者要看framework的解码代码,如果是第2方解码的库,应该有输出的接口。 后者在display部分。 ============解决方案12============ 引用 26 楼 yu8fei 的回复:这是VirtualDisplay,内容好少啊,能用吗,不知道怎么用诶?Quote: 引用 22 楼 YKDSea 的回复: Quote: 引用 16 楼 yu8fei 的回复: Quote: 引用 12 楼 YKDSea 的回复: video播放是在graphic层显示的才能抓,有的方案video直接硬件的layer显示的,这种就没辙了。 graphic层可以试下下面两个方法: 1,在native层调用mediaplayer,MediaPlayer::setVideoSurfaceTexture接口是传入一个IGraphicBufferProducer,自己建立一个bufferqueue传进去就可以了。 2,用virtual display试试看,建立一个虚拟的display。然后仿照surfaceview写一个新的view,把window建立在前面建立的virtual display上。这样输出的数据都在virtual display的buffer中。public final class VirtualDisplay { private final DisplayManagerGlobal mGlobal; private final Display mDisplay; private IBinder mToken; VirtualDisplay(DisplayManagerGlobal global, Display display, IBinder token) { mGlobal = global; mDisplay = display; mToken = token; } /** * Gets the virtual display. */ public Display getDisplay() { return mDisplay; } /** * Releases the virtual display and destroys its underlying surface. * <p> * All remaining windows on the virtual display will be forcibly removed * as part of releasing the virtual display. * </p> */ public void release() { if (mToken != null) { mGlobal.releaseVirtualDisplay(mToken); mToken = null; } } @Override public String toString() { return "VirtualDisplay{display=" + mDisplay + ", token=" + mToken + "}"; } }
可以先看下virtualdisplaytest.java里面是怎么用的……突然发现SurfaceView中没有Surface,这个window怎么搞
有的,SurfaceView.getHolder().getSurface()
============解决方案13============
引用 28 楼 yu8fei 的回复:
Quote: 引用 27 楼 YKDSea 的回复:
Quote: 引用 26 楼 yu8fei 的回复:
Quote: 引用 22 楼 YKDSea 的回复:
Quote: 引用 16 楼 yu8fei 的回复:
Quote: 引用 12 楼 YKDSea 的回复:
video播放是在graphic层显示的才能抓,有的方案video直接硬件的layer显示的,这种就没辙了。
graphic层可以试下下面两个方法:
1,在native层调用mediaplayer,MediaPlayer::setVideoSurfaceTexture接口是传入一个IGraphicBufferProducer,自己建立一个bufferqueue传进去就可以了。
2,用virtual display试试看,建立一个虚拟的display。然后仿照surfaceview写一个新的view,把window建立在前面建立的virtual display上。这样输出的数据都在virtual display的buffer中。
Quote: 引用 26 楼 yu8fei 的回复:
Quote: 引用 22 楼 YKDSea 的回复:
Quote: 引用 16 楼 yu8fei 的回复:
Quote: 引用 12 楼 YKDSea 的回复:
video播放是在graphic层显示的才能抓,有的方案video直接硬件的layer显示的,这种就没辙了。
graphic层可以试下下面两个方法:
1,在native层调用mediaplayer,MediaPlayer::setVideoSurfaceTexture接口是传入一个IGraphicBufferProducer,自己建立一个bufferqueue传进去就可以了。
2,用virtual display试试看,建立一个虚拟的display。然后仿照surfaceview写一个新的view,把window建立在前面建立的virtual display上。这样输出的数据都在virtual display的buffer中。
这是VirtualDisplay,内容好少啊,能用吗,不知道怎么用诶? 可以先看下virtualdisplaytest.java里面是怎么用的……突然发现SurfaceView中没有Surface,这个window怎么搞 有的,SurfaceView.getHolder().getSurface()现在出现新问题了,DisplayManager.createVirtualDisplay需要API Lv19,目前一般的都是android4.2才Lv17,这怎么办啊 这没招了....,这条路就走不通了 ============解决方案14============ 顶 做过音频的 好像有个 fft的算法 ============解决方案15============ 初学者,看看 ============解决方案16============ 坐等高手解决 ============解决方案17============ 引用 36 楼 yu8fei 的回复:查了下,貌似用SurfaceTexture从video decode里面获取流是最方便的,先去学学怎么用了, 大神们 求指导~还没有弄出来,这两天看了一下ffmpeg,但是NDK开发太难了,我对C也不懂,先看一下你说的这个 ============解决方案18============ 引用 36 楼 yu8fei 的回复:查了下,貌似用SurfaceTexture从video decode里面获取流是最方便的,先去学学怎么用了, 大神们 求指导~java层的surfacetexture没法获取他的surface,去给meidplayer啊~~~ native才有可能 ============解决方案19============ 引用 42 楼 yu8fei 的回复:错了错了,弄混乱了有点, 上面那个不是“读取camera图像流的例子”,是另外的一个 SurfaceTexture测试video用的, createProgram对应的俩个参数就是上面的两个字符串,求大神帮忙解释说明下,应该从哪里着手是啊,搞到现在一点进度都没有,哎。。。 ============解决方案20============ 引用 42 楼 yu8fei 的回复:错了错了,弄混乱了有点, 上面那个不是“读取camera图像流的例子”,是另外的一个 SurfaceTexture测试video用的, createProgram对应的俩个参数就是上面的两个字符串,求大神帮忙解释说明下,应该从哪里着手camera里面有个api,setPreviewTexture来接收surfacetexture,但是mediaplayer没有这样的api的。 ============解决方案21============ 引用 45 楼 yu8fei 的回复:Quote: 引用 44 楼 YKDSea 的回复: Quote: 引用 42 楼 yu8fei 的回复: 错了错了,弄混乱了有点, 上面那个不是“读取camera图像流的例子”,是另外的一个 SurfaceTexture测试video用的, createProgram对应的俩个参数就是上面的两个字符串,求大神帮忙解释说明下,应该从哪里着手camera里面有个api,setPreviewTexture来接收surfacetexture,但是mediaplayer没有这样的api的。能使用SurfaceTexture代替SurfaceView来显示,播放电影应该就可以了吧,能做到吗这样?SurfaceTexture不会用也没有api,google打不开!! 下午看了下Surface的api,有个途径可以试下,写一个类似下面的class public class LocalHolder implements SurfaceHolder{ SurfaceTexture m_st; Surface m_surface; LocalHolder(SurfaceTexture st){ m_st = st; m_surface = new Suface(m_st); } @Override public Surface getSurface() { return m_surface; } ....//其他接口还需要补全 }
这样,你建立一个SurfaceTexture初始化后传给用这个texture构造一个LocalHolder出来,
然后Mediaplayer.setDisplay就传入LocalHolder对象。
============解决方案22============
引用 47 楼 YKDSea 的回复:
Quote: 引用 45 楼 yu8fei 的回复:
Quote: 引用 44 楼 YKDSea 的回复:
Quote: 引用 42 楼 yu8fei 的回复:
错了错了,弄混乱了有点, 上面那个不是“读取camera图像流的例子”,是另外的一个 SurfaceTexture测试video用的,
createProgram对应的俩个参数就是上面的两个字符串,求大神帮忙解释说明下,应该从哪里着手
Quote: 引用 44 楼 YKDSea 的回复:
Quote: 引用 42 楼 yu8fei 的回复:
错了错了,弄混乱了有点, 上面那个不是“读取camera图像流的例子”,是另外的一个 SurfaceTexture测试video用的,
createProgram对应的俩个参数就是上面的两个字符串,求大神帮忙解释说明下,应该从哪里着手
camera里面有个api,setPreviewTexture来接收surfacetexture,但是mediaplayer没有这样的api的。能使用SurfaceTexture代替SurfaceView来显示,播放电影应该就可以了吧,能做到吗这样?SurfaceTexture不会用也没有api,google打不开!!
下午看了下Surface的api,有个途径可以试下,写一个类似下面的class
引用 50 楼 yu8fei 的回复:Quote: 引用 47 楼 YKDSea 的回复: Quote: 引用 45 楼 yu8fei 的回复: Quote: 引用 44 楼 YKDSea 的回复: Quote: 引用 42 楼 yu8fei 的回复: 错了错了,弄混乱了有点, 上面那个不是“读取camera图像流的例子”,是另外的一个 SurfaceTexture测试video用的, createProgram对应的俩个参数就是上面的两个字符串,求大神帮忙解释说明下,应该从哪里着手camera里面有个api,setPreviewTexture来接收surfacetexture,但是mediaplayer没有这样的api的。能使用SurfaceTexture代替SurfaceView来显示,播放电影应该就可以了吧,能做到吗这样?SurfaceTexture不会用也没有api,google打不开!! 下午看了下Surface的api,有个途径可以试下,写一个类似下面的class public class LocalHolder implements SurfaceHolder{ SurfaceTexture m_st; Surface m_surface; LocalHolder(SurfaceTexture st){ m_st = st; m_surface = new Suface(m_st); } @Override public Surface getSurface() { return m_surface; } ....//其他接口还需要补全 }
这样,你建立一个SurfaceTexture初始化后传给用这个texture构造一个LocalHolder出来,
然后Mediaplayer.setDisplay就传入LocalHolder对象。这个API我知道,问题是播放不出来东西、
surfacetexture界面上肯定是看不到东西的,先setOnFrameAvailableListener()设置个listener看看有没有数据上来,要想看到,还要把texture再画出去。
============解决方案24============
不知道你是怎么理解的,onFrameAvailable是回调函数,有新数据来的时候,才会被调用,不是看调用的参数。
============解决方案25============
引用 54 楼 yu8fei 的回复:
Quote: 引用 53 楼 YKDSea 的回复:
不知道你是怎么理解的,onFrameAvailable是回调函数,有新数据来的时候,才会被调用,不是看调用的参数。
是不知道怎么用。播放视频的时候数据流是有更新的,它就会一直被调用的,如果要进行数据处理,应该就是在这进行。 视频正播放的时候无画面输出,只有声音。 如果我要取出SurfaceTexture中的数据应该怎么取呢?不知道你是怎么理解的,onFrameAvailable是回调函数,有新数据来的时候,才会被调用,不是看调用的参数。
到jni层去操作就好做了,surfaceTexture.java里面的mSurfaceTexture分别对应了GLConsumer。
新的frame来的时候,先调用SurfaceTexture.updateTexImage()更新一下buffer,然后GLConsumer.getCurrentBuffer()可以拿到GraphicBuffer了,GraphicBuffer.lock()又可以直接拿到指针了。要注意color format。
============解决方案26============
引用 57 楼 yu8fei 的回复:
Quote: 引用 56 楼 YKDSea 的回复:
Quote: 引用 54 楼 yu8fei 的回复:
Quote: 引用 53 楼 YKDSea 的回复:
不知道你是怎么理解的,onFrameAvailable是回调函数,有新数据来的时候,才会被调用,不是看调用的参数。
是不知道怎么用。播放视频的时候数据流是有更新的,它就会一直被调用的,如果要进行数据处理,应该就是在这进行。 视频正播放的时候无画面输出,只有声音。 如果我要取出SurfaceTexture中的数据应该怎么取呢?Quote: 引用 54 楼 yu8fei 的回复:
Quote: 引用 53 楼 YKDSea 的回复:
不知道你是怎么理解的,onFrameAvailable是回调函数,有新数据来的时候,才会被调用,不是看调用的参数。
到jni层去操作就好做了,surfaceTexture.java里面的mSurfaceTexture分别对应了GLConsumer。
新的frame来的时候,先调用SurfaceTexture.updateTexImage()更新一下buffer,然后GLConsumer.getCurrentBuffer()可以拿到GraphicBuffer了,GraphicBuffer.lock()又可以直接拿到指针了。要注意color format。不理解你这句话“surfaceTexture.java里面的mSurfaceTexture分别对应了GLConsumer”是什么意思?
ps:这些都是你现学的么?从哪儿学的哇怎么学这么快懂这么多…
写错了,应该是”surfaceTexture.java里面的成员mSurfaceTexture,他是int类型,实际是一个指向native层的GLConsumer对象的指针。“
这些在android代码里面都有的,不要光看api,往下看看实现。
============解决方案27============
引用 59 楼 yu8fei 的回复:
Quote: 引用 58 楼 YKDSea 的回复:
Quote: 引用 57 楼 yu8fei 的回复:
Quote: 引用 56 楼 YKDSea 的回复:
Quote: 引用 54 楼 yu8fei 的回复:
Quote: 引用 53 楼 YKDSea 的回复:
写错了,应该是”surfaceTexture.java里面的成员mSurfaceTexture,他是int类型,实际是一个指向native层的GLConsumer对象的指针。“这些在android代码里面都有的,不要光看api,往下看看实现。mTextureID是int类型的,mSurfaceTexture是SurfaceTexture类型的Quote: 引用 57 楼 yu8fei 的回复:
Quote: 引用 56 楼 YKDSea 的回复:
Quote: 引用 54 楼 yu8fei 的回复:
Quote: 引用 53 楼 YKDSea 的回复:
你看的哪个文件?我说的是class SurfaceTexture里面。
============解决方案28============
VideoSurfaceView这个是你自己写的吧?
我的意思是要对SurfaceTexture扩展一下,前面说的成员都是class SufaceTexture中的,你要拿的buffer就在class SurfaceTexture中。
============解决方案29============
引用 63 楼 yu8fei 的回复:
Quote: 引用 62 楼 YKDSea 的回复:
VideoSurfaceView这个是你自己写的吧?
我的意思是要对SurfaceTexture扩展一下,前面说的成员都是class SufaceTexture中的,你要拿的buffer就在class SurfaceTexture中。
也不一定必须对SurfaceTexture扩展,Surface surface = new Surface(mSurfaceTexture);mMediaPlayer.setSurface(surface);这样播放的视频就在SurfaceTexture上了。 在SurfaceTexture.java中,定义的mSurfaceTexture并没有使用只是有那么一行注释,没有任何操作…扩展了SurfaceTexture也是没法从它入手的VideoSurfaceView这个是你自己写的吧?
我的意思是要对SurfaceTexture扩展一下,前面说的成员都是class SufaceTexture中的,你要拿的buffer就在class SurfaceTexture中。
mSurfaceTexture是在jni里面赋值的,java层的确看不到什么东西。从Surface入手,我觉得是不好做的,surface是处于一个生产者的角色,SurfaceTexture才是消费者,你现在是要使用player生产出来的buffer,从SurfaceTexture这边入手更合适。
============解决方案30============
呵呵呵.....
一般android的显示一般有两层(或者两层以上), fb0, 和 fb1, fb1 在 fb0 的下面, fb1 显示软件的界面, fb0 平时一般是透明的, 在播放视频 的时候, 如果视频使用硬件解码, 解码后的 YUV 图像帧 直接 memcpy 到 fb0 的 framebuffer中, 这时候你就可以看到视频了, 中间不经过任何JAVA代码, 如果不是全屏, 那么fb0的只有视频区域的 alpha值 为 255, 其它区域为0, 使得后面的界面可以透上来...
你要抓 解码后的数据, 从GPU的驱动下手, HOOK一个接口出来可能有希望......
相关文章推荐
- 请教:Android正播放视频时的解码输出流如何获取?
- Android如何获取assets或者raw目录的视频文件路径播放视频
- 如何获取UIWebView中全屏播放视频事件
- 【流媒體】Android 实时视频采集/编码/传输/解码/播放—方案调研(初)
- Android中如何获取视频文件的缩略图
- (七)8天快速掌握Android视频教程_查看应用输出的错误信息与如何部署应用到真实手机
- Android如何判断当前手机是否正在播放音乐,并获取到正在播放的音乐的信息
- 【流媒體】Android 实时视频采集/编码/传输/解码/播放—方案调研(初)
- Android中通过网络获取json数据来播放视频
- Android之如何获取视频或者图片的缩略图
- Android如何判断当前手机是否正在播放音乐,并获取到正在播放的音乐的信息
- Android开发与iphone开发如何获取视频数据单元
- Android如何判断当前手机是否正在播放音乐,并获取到正在播放的音乐的信息
- [Android算法] 实现获取视频的缩略图(ThumbnailUtils),并且播放
- Android 实时视频采集/编码/传输/解码/播放 方案调研
- Android通过软解码播放视频
- vlc_android中获取视频播放状态
- android 视频播放以 overlay 方式输出
- android4.2.2的stagefright架构下基于SurfaceFlinger的视频解码输出缓存创建机制
- Android如何判断当前手机是否正在播放音乐,并获取到正在播放的音乐的信息