究竟是什么" Surface" Android中的课程?

时间:2016-08-08 11:14:42

标签: android television

我已经尝试了很长时间在" Surface"使用MediaPlayer类的类。它播放音频,但视频不播放。在我搜索的任何地方,人们都在谈论SurfaceView和SurfaceHolder,但我只有一个Surface对象。如何破解这个拦截器?

这是我尝试的方式,

public class SampleVideoPlayer{

private Uri mUrl;
private Surface mSurface;
private MediaPlayer mMediaPlayer;
private Context mContext;

public SampleVideoPlayer(Context context, String url, Surface surface){
    mUrl = Uri.parse(url);
    mSurface = surface;
    mMediaPlayer = new MediaPlayer();
    mContext = context;
}

public void playVideo() throws IOException {
        mMediaPlayer.setDataSource(mContext, mUrl);
        mMediaPlayer.setSurface(mSurface);
        mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener(){
            @Override
            public void onPrepared(MediaPlayer mediaPlayer) {
                mediaPlayer.start();
            }
        });
        mMediaPlayer.prepareAsync();
}

}

添加我传递的会话对象

public class MyTvSession extends TvInputService.Session implements Handler.Callback {

Context mContext;
String vidUrl;
Surface mSurface;
SampleVideoPlayer player = null;
SampleMediaPlayer mediaPlayer;

public MyTvSession(Context context){
    super(context);
    ChannelXmlReader reader = new ChannelXmlReader(context);
    ArrayList<Channel> channels = reader.ReadXml();
    mContext = context;
    vidUrl = channels.get(0).url;
}
@Override
public boolean handleMessage(Message message) {
    Log.d("HANDLE MESSAGE", message.toString());
    return true;
}

@Override
public void onRelease() {

}

@Override
public boolean onSetSurface(Surface surface) {
    if(surface != null)
        Log.d("NOT NULL from SESSION", "NOTNULL");
    mSurface = surface;
    return true;
}

@Override
public void onSurfaceChanged(int format, int width, int height) {
    super.onSurfaceChanged(format, width, height);
    if(mediaPlayer != null)
        mediaPlayer.mMediaPlayer.setSurface(mSurface);

    Log.d("ONSURFACECHANGED", "Event");
}



@Override
public void onSetStreamVolume(float v) {

}

@Override
public boolean onTune(Uri uri) {
    Log.d("TUNING CHANNEL", uri.toString());
    try {
        mediaPlayer = new SampleMediaPlayer(mContext, vidUrl, mSurface);
        mediaPlayer.playVideo();
    }catch(Exception e){
        Log.d("MPEXCEPTION", Log.getStackTraceString(e));
    }
    return true;
}

@Override
public void onSetCaptionEnabled(boolean b) {

}

}

2 个答案:

答案 0 :(得分:1)

Surface类是与支持surfaceflinger进程共享的缓冲区列表的瘦包装器,后者负责呈现给显示器。

您可以使用SurfaceView及其SurfaceHolder来获取其中一个,这些视图与视图的生命周期相关联。因此,在创建曲面后回调后,请确保获得它。

或者,您可以使用使用自己的自定义OpenGL上下文创建的SurfaceTexture。使用这种方法,您可以使用自己的OpenGL代码进行渲染,甚至可以将其传递给媒体引擎进行渲染。您还可以使用SurfaceTextureTextureView绑定到视图子系统(但与SurfaceView一样,您需要在其生命周期的适当时间使用它。)

答案 1 :(得分:1)

我有完全相同的问题。但它只发生在飞利浦电视上。在其他所有Android TV设备上运行相同的代码。我在onSetSurface上获得的表面是有效的,声音在播放,但是图片是黑色的。当我关闭应用程序时,视频会显示一秒钟。它似乎在后台。