gpt4 book ai didi

android - Android 中的 "Surface"类到底是什么?

转载 作者:行者123 更新时间:2023-11-29 19:39:24 26 4
gpt4 key购买 nike

长期以来,我一直在尝试使用 MediaPlayer 类在“Surface”类上渲染视频。它正在播放音频,但没有播放视频。在我搜索的每个地方,人们都在谈论 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();
}

添加我传递的 session 对象,

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) {

}

最佳答案

Surface 类是一个缓冲区列表的薄包装器,它与支持 surfaceflinger 进程共享,负责渲染到显示器。

您可以使用 SurfaceView 及其 SurfaceHolder 获取其中之一,它们与 View 的生命周期相关。所以一定要在surface创建完成后回调获取。

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

关于android - Android 中的 "Surface"类到底是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38827801/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com