【发布时间】:2016-08-08 11:14:42
【问题描述】:
长期以来,我一直在尝试使用 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) {
}
}
【问题讨论】:
-
我已经阅读该页面很长时间了!我想知道如何让 MediaPlayer 在表面上播放视频!
-
你的意思是
setDisplay(SurfaceHolder sh)? -
请检查上面的代码。我有一个“表面”来绘制我的视频。不是 SurfaceHolder 或 SurfaceView
-
所以使用
setSurface(Surface surface)...你为什么不阅读MediaPlayer文档?
标签: android television