SurfaceView、SurfaceTexture 和 MediaPlayer 无法在 android 中播放我的视频
SurfaceView, SurfaceTexture and MediaPlayer cant play my video in android
我正在尝试使用 SurfaceView
在我的应用程序上播放实时流媒体视频,当我使用 Vitamio
尝试播放时效果很好,但由于它是 HTTP link,我试图摆脱任何第 3 方库并使用本机 类。我一如既往地尝试了 VideoView
,然后我在失败后尝试了 SurfaceView 基本实现 我试过这样的纹理视频:
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width, int height) {
Surface surface = new Surface(surfaceTexture);
try {
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setDataSource(getApplicationContext(), Uri.parse(link));
mMediaPlayer.setSurface(surface);
mMediaPlayer.setLooping(true);
mMediaPlayer.prepareAsync();
// Play video when the media source is ready for playback.
mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mediaPlayer) {
mediaPlayer.start();
}
});
mMediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
Log.d(TAG, "Error occured");
return false;
}
});
} catch (IllegalArgumentException e) {
Log.d(TAG, e.getMessage());
} catch (SecurityException e) {
Log.d(TAG, e.getMessage());
} catch (IllegalStateException e) {
Log.d(TAG, e.getMessage());
} catch (IOException e) {
Log.d(TAG, e.getMessage());
}
}
但每次调用 MediaPlayer 的 OnError 时都没有运气,在 logcat 我得到这个:
06-28 16:00:56.612 144-8044/? E/GenericSource﹕ Failed to prefill data cache!
06-28 16:00:56.614 7997-8016/? E/MediaPlayer﹕ error (1, -2147483648)
06-28 16:00:56.614 7997-7997/? E/MediaPlayer﹕ Error (1,-2147483648)
但问题是 URL 没有问题,这个 url 在 vitamio 和我可以测试的所有其他游戏上播放都很好,请帮忙!!
我曾尝试通过 MediaPlayer
在 Android 上播放视频,但我也曾尝试过 Vitamio。大多数情况下,如果视频无法在 Android 的 MediaPlayer
上正常播放,那是因为它的格式不受支持。
http://developer.android.com/guide/appendix/media-formats.html
这可能不是您想要的答案,但您可能需要将要播放的任何内容重新编码为受支持的格式。 Android的视频播放能力远不如iphone,这是你不得不接受的。
如果您愿意投入(大量)更多工作,您可以自己为 android 编译 ffmpeg,为它的许多组件创建一个 jni 接口,然后将视频播放到 surface/texture 视图。我个人不推荐这条路线,因为我通过 ffmpeg 流式传输 1080p 视频的体验并不好。
最好、最简单的方法是简单地重新编码您的视频。
背景:我制作了一个应用程序,可以同时播放来自不同供应商的多达 5 个视频。
这似乎是 2 个问题之一。格式不正确或文件存在权限问题,无法打开。
首先使用 ffmpeg 转换视频。我使用此命令转换为可流式传输的 mp4:
ffmpeg -i InputVideo.mp4 -c:v libx264 -profile:v baseline -c:a libfaac -ar 44100 -ac 2 -b:a 128k -movflags faststart OutputVideo.mp4
其次,尝试先将视频作为文件加载,然后将数据源传递给媒体播放器。有时需要这样做,因为我注意到当使用 MediaPlayer 打开文件时,它会触发 OS 级别调用来加载文件,而文件位于应用程序的私有文件夹中,因此 OS 无法打开.我们这样做:
AssetFileDescriptor afd = contxt.getResources().openRawResourceFd(R.raw.prepare_artwork);
if (afd == null) {
Log.e(TAG, "Failed to load video.");
} else {
mMediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
afd.close();
}
我正在尝试使用 SurfaceView
在我的应用程序上播放实时流媒体视频,当我使用 Vitamio
尝试播放时效果很好,但由于它是 HTTP link,我试图摆脱任何第 3 方库并使用本机 类。我一如既往地尝试了 VideoView
,然后我在失败后尝试了 SurfaceView 基本实现 我试过这样的纹理视频:
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width, int height) {
Surface surface = new Surface(surfaceTexture);
try {
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setDataSource(getApplicationContext(), Uri.parse(link));
mMediaPlayer.setSurface(surface);
mMediaPlayer.setLooping(true);
mMediaPlayer.prepareAsync();
// Play video when the media source is ready for playback.
mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mediaPlayer) {
mediaPlayer.start();
}
});
mMediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
Log.d(TAG, "Error occured");
return false;
}
});
} catch (IllegalArgumentException e) {
Log.d(TAG, e.getMessage());
} catch (SecurityException e) {
Log.d(TAG, e.getMessage());
} catch (IllegalStateException e) {
Log.d(TAG, e.getMessage());
} catch (IOException e) {
Log.d(TAG, e.getMessage());
}
}
但每次调用 MediaPlayer 的 OnError 时都没有运气,在 logcat 我得到这个:
06-28 16:00:56.612 144-8044/? E/GenericSource﹕ Failed to prefill data cache!
06-28 16:00:56.614 7997-8016/? E/MediaPlayer﹕ error (1, -2147483648)
06-28 16:00:56.614 7997-7997/? E/MediaPlayer﹕ Error (1,-2147483648)
但问题是 URL 没有问题,这个 url 在 vitamio 和我可以测试的所有其他游戏上播放都很好,请帮忙!!
我曾尝试通过 MediaPlayer
在 Android 上播放视频,但我也曾尝试过 Vitamio。大多数情况下,如果视频无法在 Android 的 MediaPlayer
上正常播放,那是因为它的格式不受支持。
http://developer.android.com/guide/appendix/media-formats.html
这可能不是您想要的答案,但您可能需要将要播放的任何内容重新编码为受支持的格式。 Android的视频播放能力远不如iphone,这是你不得不接受的。
如果您愿意投入(大量)更多工作,您可以自己为 android 编译 ffmpeg,为它的许多组件创建一个 jni 接口,然后将视频播放到 surface/texture 视图。我个人不推荐这条路线,因为我通过 ffmpeg 流式传输 1080p 视频的体验并不好。
最好、最简单的方法是简单地重新编码您的视频。
背景:我制作了一个应用程序,可以同时播放来自不同供应商的多达 5 个视频。
这似乎是 2 个问题之一。格式不正确或文件存在权限问题,无法打开。
首先使用 ffmpeg 转换视频。我使用此命令转换为可流式传输的 mp4:
ffmpeg -i InputVideo.mp4 -c:v libx264 -profile:v baseline -c:a libfaac -ar 44100 -ac 2 -b:a 128k -movflags faststart OutputVideo.mp4
其次,尝试先将视频作为文件加载,然后将数据源传递给媒体播放器。有时需要这样做,因为我注意到当使用 MediaPlayer 打开文件时,它会触发 OS 级别调用来加载文件,而文件位于应用程序的私有文件夹中,因此 OS 无法打开.我们这样做:
AssetFileDescriptor afd = contxt.getResources().openRawResourceFd(R.raw.prepare_artwork);
if (afd == null) {
Log.e(TAG, "Failed to load video.");
} else {
mMediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
afd.close();
}