我很难弄清楚如何使用Rajawali播放360视频。为了达到这个目的,我尝试了我能在互联网上找到的所有解决方案,但我失败了。
首先,我使用了RajawaliCardboard,并让MainActivity从CardboardActivity扩展。同时,在MyRenderer类中,我允许这个类从RajawaliCardboardRenderer类扩展。在MyRenderer类中,我重写了initScene()函数:
protected void initScene() {
StreamingTexture mTexture = null;
if (externalMemoryAvailable())
{
mVideoPath = Environment.getExternalStorageDirectory().getAbsolutePath()+"/testVideo.mp4";
try{
mPlayer = new MediaPlayer();
mPlayer.setDataSource(mVideoPath);
}catch(IllegalArgumentException e){
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
mPlayer.prepare();
} catch (IOException t) {
t.printStackTrace();
}
mTexture = new StreamingTexture("video", mPlayer);
}
Sphere sphere = createPhotoSphereWithTexture(mTexture);
getCurrentScene().addChild(sphere);
getCurrentCamera().setPosition(Vector3.ZERO);
getCurrentCamera().setFieldOfView(75);
}
private Sphere createPhotoSphereWithTexture(ATexture texture) {
Material material = new Material();
material.setColor(0);
try {
material.addTexture(texture);
} catch (ATexture.TextureException e) {
throw new RuntimeException(e);
}
Sphere sphere = new Sphere(50, 64, 32);
sphere.setScaleX(-1);
sphere.setMaterial(material);
return sphere;
}该程序可以运行没有任何错误,但屏幕是黑色的,没有图像。
我想问我应该做些什么来改进我的程序,以及为什么我要用Rajawali来播放视频。有谁能帮帮我呢?
发布于 2015-09-08 07:35:56
我成功地和拉贾瓦利一起播放了视频。
public class VideoRenderer extends RajawaliCardboardRenderer {
Context mContext;
private MediaPlayer mMediaPlayer;
private StreamingTexture mVideoTexture;
public VideoRenderer(Context context) {
super(context);
mContext = context;
}
@Override
protected void initScene() {
mMediaPlayer = MediaPlayer.create(getContext(),
R.raw.video);
mMediaPlayer.setLooping(true);
mVideoTexture = new StreamingTexture("sintelTrailer", mMediaPlayer);
Material material = new Material();
material.setColorInfluence(0);
try {
material.addTexture(mVideoTexture);
} catch (ATexture.TextureException e) {
e.printStackTrace();
}
Sphere sphere = new Sphere(50, 64, 32);
sphere.setScaleX(-1);
sphere.setMaterial(material);
getCurrentScene().addChild(sphere);
getCurrentCamera().setPosition(Vector3.ZERO);
getCurrentCamera().setFieldOfView(75);
mMediaPlayer.start();
}
@Override
protected void onRender(long ellapsedRealtime, double deltaTime) {
super.onRender(ellapsedRealtime, deltaTime);
mVideoTexture.update();
}
@Override
public void onPause() {
super.onPause();
if (mMediaPlayer != null)
mMediaPlayer.pause();
}
@Override
public void onResume() {
super.onResume();
if (mMediaPlayer != null)
mMediaPlayer.start();
}
@Override
public void onRenderSurfaceDestroyed(SurfaceTexture surfaceTexture) {
super.onRenderSurfaceDestroyed(surfaceTexture);
mMediaPlayer.stop();
mMediaPlayer.release();
}
public void nextVideo(String nextVideoPath){
try{
mMediaPlayer.stop();
mMediaPlayer.reset();
mMediaPlayer.setDataSource(nextVideoPath);
mMediaPlayer.prepare();
mMediaPlayer.start();
}catch (Exception e){
e.printStackTrace();
}
}
}发布于 2015-09-07 15:29:45
我认为您的主要错误是在媒体播放器中调用MediaPlayer.prepare(),而不是MediaPlayer.prepareAsync()。
您必须考虑到MediaPlayer在播放视频时所经历的不同状态。这里有一个指向状态图的链接。您应该只在视频播放器完成所有准备工作之后才调用MediaPlayer.start(),以便视频开始播放。
我正在和Rajawali一起做同样的事情( 360段视频播放器),到目前为止,我已经在正常的陀螺仪和触摸模式下复制了它们,但是我发现了很多问题来使它与Google集成一起工作,所以我现在正在尝试制作自己的"sideBySide“渲染器。
如果我的评论还不够的话,这里有一个代码示例,我正在使用它在Sphere上以流纹理的形式再现视频。它是扩展initScene()的类上被覆盖的方法RajawaliRenderer的一部分。
//create a 100 segment sphere
earthSphere = new Sphere(1, 100, 100);
//try to set the mediaPLayer data source
mMediaPlayer = new MediaPlayer();
try{
mMediaPlayer.setDataSource(context, Uri.parse("android.resource://" + context.getPackageName() + "/" + R.raw.pyrex));
}catch(IOException ex){
Log.e("ERROR","couldn attach data source to the media player");
}
mMediaPlayer.setLooping(true); //enable video looping
video = new StreamingTexture("pyrex",mMediaPlayer); //create video texture
mMediaPlayer.prepareAsync(); //prepare the player (asynchronous)
mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp.start(); //start the player only when it is prepared
}
});
//add textture to a new material
Material material = new Material ();
material.setColorInfluence(0f);
try{
material.addTexture(video);
}catch(ATexture.TextureException ex){
Log.e("ERROR","texture error when adding video to material");
}
//set the material to the sphere
earthSphere.setMaterial(material);
earthSphere.setPosition(0, 0, 0);
//add the sphere to the rendering scene
getCurrentScene().addChild(earthSphere);发布于 2016-07-13 15:52:10
因为你想播放360视频,你需要一些定位跟踪器。这里是纸板活动的例子。
public class CardboardRendererExample extends Renderer implements CardboardView.StereoRenderer {
public static final int FIELD_OF_VIEW = 90;
public static final float PLANE_WIDTH = 64.0f;
public static final float PLANE_HEIGHT = 36.0f;
public static final float PLANE_DISTANCE = -64.0f;
private final MediaPlayer mMediaPlayer;
protected StreamingTexture mStreamingTexture;
protected Quaternion mOrientation = Quaternion.getIdentity();
protected Quaternion mEyeOrientation = Quaternion.getIdentity();
protected float[] mHeadView = new float[16];
private Matrix4 mEyeMatrix = new Matrix4();
private Vector3 mEyePosition = new Vector3();
private Matrix4 mHeadViewMatrix4 = new Matrix4();
public CardboardRendererExample(Context context, MediaPlayer mediaPlayer) {
super(context);
mMediaPlayer = mediaPlayer;
}
@Override
protected void initScene() {
getCurrentCamera().setPosition(Vector3.ZERO);
getCurrentCamera().setFieldOfView(FIELD_OF_VIEW);
mStreamingTexture = new StreamingTexture("give_it_some_name", mMediaPlayer);
mStreamingTexture.shouldRecycle(true);
setSceneCachingEnabled(true);
final Plane projectionScreen = new Plane(PLANE_WIDTH, PLANE_HEIGHT, 64, 64);
final Material material = new Material();
material.setColor(0);
material.setColorInfluence(0f);
try {
material.addTexture(mStreamingTexture);
} catch (ATexture.TextureException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
projectionScreen.setDoubleSided(true);
projectionScreen.setMaterial(material);
projectionScreen.setTransparent(true);
projectionScreen.setPosition(0, 0, PLANE_DISTANCE);
getCurrentScene().addChild(projectionScreen);
getCurrentScene().addChild(projectionScreen);
}
@Override
public void onNewFrame(HeadTransform headTransform) {
headTransform.getHeadView(mHeadView, 0);
mHeadViewMatrix4.setAll(mHeadView).inverse();
mOrientation.fromMatrix(mHeadViewMatrix4);
}
@Override
public void onDrawEye(Eye eye) {
getCurrentCamera().updatePerspective(
eye.getFov().getLeft(),
eye.getFov().getRight(),
eye.getFov().getBottom(),
eye.getFov().getTop());
mEyeMatrix.setAll(eye.getEyeView());
mEyeOrientation.fromMatrix(mEyeMatrix);
getCurrentCamera().setOrientation(mEyeOrientation);
mEyePosition = mEyeMatrix.getTranslation(mEyePosition).inverse();
getCurrentCamera().setPosition(mEyePosition);
super.onRenderFrame(null);
}
@Override
public void onFinishFrame(Viewport viewport) {
}
@Override
public void onSurfaceChanged(int width, int height) {
super.onRenderSurfaceSizeChanged(null, width, height);
}
@Override
public void onSurfaceCreated(EGLConfig eglConfig) {
super.onRenderSurfaceCreated(eglConfig, null, -1, -1);
}
@Override
public void onRenderSurfaceCreated(EGLConfig config, GL10 gl, int width, int height) {
super.onRenderSurfaceCreated(config, gl, width, height);
}
@Override
public void onRendererShutdown() {
}
@Override
protected void onRender(long elapsedRealTime, double deltaTime) {
super.onRender(elapsedRealTime, deltaTime);
if (mStreamingTexture != null) {
mStreamingTexture.update();
}
}
@Override
public void onOffsetsChanged(float xOffset, float yOffset, float xOffsetStep, float yOffsetStep, int xPixelOffset, int yPixelOffset) {
}
@Override
public void onTouchEvent(MotionEvent event) {
}}
另外,您也可以基于(例如)实现跟踪器。
com.google.vrtoolkit.cardboard.sensors.HeadTracker当然,您可以摆脱所有这些字段,但它们应该可以使GC生活更轻松。
https://stackoverflow.com/questions/32391282
复制相似问题