我希望能在我的安卓设备上流畅地播放(渲染到表面)两个或更多连续的MP4视频序列(每个都存储在设备上的不同文件中,也许在启动时不存在),以使观众感受到只观看了一个连续的视频,而没有停顿、闪烁等现象。首先,仅针对我的Nexus 7平板电脑实现这一点就足够了。
为了显示单个视频,我一直在使用MediaCodec API,类似于http://dpsm.wordpress.com/2012/07/28/android-mediacodec-decoded/,它运行良好。只有在第一个序列结束后(调用decoder.stop和decoder.release),创建并配置第二个解码器,才能看到混合效果。为了实现两个不同视频序列之间的平滑淡入淡出,我考虑在第一个视频播放期间通过init功能预先初始化第二个视频,方法是通过decoder.configure(format, surface, null, 0)进行配置。此外,第一帧视频也通过decoder.queueInputBuffer排队。
但是这样做会导致以下错误:
01-13 16:20:37.182: E/BufferQueue(183): [SurfaceView] connect: already connected (cur=3, req=3)
01-13 16:20:37.182: E/MediaCodec(9148): native_window_api_connect returned an error: Invalid argument (-22)
01-13 16:20:37.182: E/Decoder Init(9148): Exception decoder.configure: java.lang.IllegalStateException
在我看来,一个表面只能同时由一个解码器使用。那么,有没有其他可能性呢?也许可以使用OpenGL?
祝好, Alex。
TextureView#getSurfaceTexture()
的SurfaceTexture。然后,TextureView类将负责锁定缓冲区并将其呈现到屏幕上。(如果您使用SurfaceView,则必须自己进行呈现。) - faddenmTextureView.setSurfaceTextureListener(this)
设置了监听器。我将SurfaceTexture转发到CodecOutputSurface并使用它代替创建新的SurfaceTexture。但是,当我尝试通过mSurfaceTexture.attachToGLContext(mTextureRender.getTextureId())
将其附加到GL上下文时,我遇到了以下错误:“E/GLConsumer: [unnamed-11969-0] attachToContext: GLConsumer is already attached to a context”。是否有必要附加它?从这里该怎么办? - A.WolfSurfaceView
获取的SurfaceTexture
的EGL上下文。那个属于UI线程。可以参考Grafika里的TextureViewGLActivity
(https://github.com/google/grafika)。在`Renderer#run()`函数中,创建一个新的EGL上下文,并使用`TextureView`的`SurfaceTexture`作为表面。技巧是,你不是在`TextureView`的`EGLSurface`上绘制,而是在它的`Surface`上绘制……这些是完全不同的东西。你在`Surface`上绘制,它会映射到一个纹理上,然后`TextureView`将其渲染到`EGLSurface`上。 - fadden