如何在TextureView上实现圆角和气泡效果的视频播放

4
我成功地在Android上使用TextureView和MediaPlayer播放了视频。我是这样做的: 我使用SurfaceTexture创建了一个Surface:
    public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int w, int h)
{
    mSurface = new Surface(surfaceTexture);
    ...
    ...
}

将 Surface 连接到 MediaPlayer:

    try
{
    mMediaPlayer.setDataSource(mPlayUrl);
    mMediaPlayer.setSurface(mSurface);
    ...
    ...
}

这还可以,但对我来说不够。我希望TextureView有圆角并且看起来像个气泡(带有一个角度),请看下面的图片: effect I expect 我找到了一篇文章(Round video corners on Android),它非常有帮助,但作者选择了GLSurfaceView并且只实现了圆角。我相信TextureView也适合实现我的效果,SurfaceTexure处理是关键。但是我不熟悉OpenGL,谁能给我一些建议?

那篇好文章的作者提供了3种方法,但他说TextureView不适合做这个。他的话是: “前两种方法当然是最方便的,但我们实际上无法控制视频如何映射到屏幕上(如果TextureView允许您定义自己的几何图形+着色器将会很棒),也无法访问帧存储的位置,以便我们可以修改它们。” 你的意思是他错了吗? - dragonfly
жИСеПСзО∞дљ†зЪДGrafikaйЬАи¶БAPIзЇІеИЂ18пЉМиАМдљ†дљњзФ®зЪДOpenGL APIеЬ®API 18дї•дЄЛдЄНеПѓзФ®гАВ - dragonfly
@fadden 请看一下这个,谢谢! http://stackoverflow.com/questions/32285253/weird-frames-appear-when-using-textureview-to-play-video-in-listview - dragonfly
我参考了您使用GL10的ExtractMpegFramesTest代码,但我发现它需要一些API的api级别为15,例如“GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES,mTextureID);” 我能用其他API来代替这段代码吗? - dragonfly
@fadden 我修改了grafika的EglCore.java到egl 1.0,并成功使用gles播放了视频。我创建了一个外部纹理作为surfacetexture并将其附加到IjkMediaplayer上,然后在onFrameAvailable中将帧绘制到TextureView上。它在我的Android 4.4手机上运行良好,但在我的4.1手机上失败,并出现一些日志:E/IJKMEDIA(10605): SDL_Android_NativeWindow_display_l: ANativeWindow_lock: failed -22 E/BufferQueue(10605): [unnamed-10605-1] connect: already connected (cur=2, req=2)。 我很失望。为什么会发生这种情况?我根本没有连接其他的生产者到surfacetexture。 - dragonfly
显示剩余19条评论
2个回答

1

-1

假设您的背景是纯色的,您可以使用遮罩轻松实现此效果。但如果您有任何形式的背景,则无法实现。


是的。如果背景改变,遮罩就会失效。这不是一个好的解决方案。 - dragonfly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接