Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/200.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“a”究竟是什么;“表面”;Android中的类?_Android_Television - Fatal编程技术网

“a”究竟是什么;“表面”;Android中的类?

“a”究竟是什么;“表面”;Android中的类?,android,television,Android,Television,我一直在尝试使用MediaPlayer类在“Surface”类上渲染视频。它在播放音频,但不是视频。无论我在哪里搜索,人们都在谈论SurfaceView和SurfaceHolder,但我只有一个Surface对象。如何破解这个拦截器 我就是这样试的 public class SampleVideoPlayer{ private Uri mUrl; private Surface mSurface; private MediaPlayer mMediaPlayer; private Contex

我一直在尝试使用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();
}
}

添加我要传递的会话对象

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

}
公共类MyTvSession扩展TvInputService。会话实现Handler.Callback{
语境;
字符串vidUrl;
表面;
SampleVideoPlayer=null;
SampleMediaPlayer;
公共MyTvSession(上下文){
超级(上下文);
ChannelXmlReader=新ChannelXmlReader(上下文);
ArrayList channels=reader.ReadXml();
mContext=上下文;
vidUrl=channels.get(0.url);
}
@凌驾
公共布尔handleMessage(消息消息){
Log.d(“处理消息”,MESSAGE.toString());
返回true;
}
@凌驾
发布时公开作废(){
}
@凌驾
公共布尔onSetSurface(曲面){
如果(曲面!=null)
Log.d(“来自会话的NOTNULL”,“NOTNULL”);
M表面=表面;
返回true;
}
@凌驾
更改了表面上的公共空白(整型格式、整型宽度、整型高度){
super.onSurfaceChanged(格式、宽度、高度);
如果(mediaPlayer!=null)
mediaPlayer.mMediaPlayer.setSurface(mssurface);
Log.d(“ONSURFACECHANGED”、“Event”);
}
@凌驾
SetStreamVolume上的公共无效(浮动v){
}
@凌驾
公共布尔onTune(Uri){
Log.d(“调优通道”,uri.toString());
试一试{
mediaPlayer=新样本mediaPlayer(mContext、vidUrl、mSurface);
mediaPlayer.playVideo();
}捕获(例外e){
Log.d(“MPEXCEPTION”,Log.getStackTraceString(e));
}
返回true;
}
@凌驾
设置CaptionEnabled上的公共无效(布尔b){
}

}Surface类是缓冲区列表周围的一个薄包装器,该缓冲区列表与backing surfaceflinger进程共享,该进程负责渲染到显示

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


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

我也有同样的问题。但这只发生在飞利浦电视上。同样的代码在其他Android电视设备上运行良好。我在屏幕上看到的表面是有效的,声音正在播放,但图片是黑色的。当我关闭应用程序时,视频会显示一秒钟。好像是在后台

我已经读了很长时间了!我想知道如何让MediaPlayer在地面上播放视频!您的意思是
setDisplay(SurfaceHolder sh)
?请检查上述代码。我有一个“表面”来绘制我的视频。不是曲面管理员或曲面视图,请使用
setSurface(曲面)
。。。你为什么不读一下MediaPlayer的文档呢?谢谢你的回答!但是,你能帮我解决我的问题吗?TvInputFramework为我提供了一个“曲面”对象,我可以在上面绘制视频。我使用MediaPlayer并将其表面设置为在其上播放视频。但是我只能听到音频内容,看不到任何视觉内容。您是如何从TV输入层获得支持的
Surface
?TvInputManager将调用我的
onSetSurface(Surface)实现的
这就是我获取backing Surface对象的方式。你确定应用程序确实为你的服务会话提供了有效的Surface吗?是的,我确定!它不是空的,它能够播放曲目的音频,每当我试图强制关闭它时,我都能看到一帧视频!甚至我也用过飞利浦电视。那个牌子的电视有点问题。不过,它在三星上运行得很好!