Android两个MediaPlayer同时跳过
Android two MediaPlayers at the same time skipping
我有一个应用可以同时播放两个视频。在 MotoG (Android 4.4.4) 上,如果该应用正在播放在 Android 设备上生成的两个视频,则它可以正常工作。如果它正在播放 iOS 上生成的单个视频,则效果很好。
但是如果它正在播放在 iOS 上生成的 1 个视频和来自 iOS 或 Android 的第二个视频,播放器就会发疯并跳过和结结巴巴并且不会正常回放。
这两种文件格式之间存在细微差别,但由于这两种文件都可以自己正常播放,所以我认为这应该是 Android 需要解决的问题。以下是不同视频文件的 ffmpeg 信息。
如果有区别,MediaPlayers
会连接显示在 SurfaceHolder
上,该 SurfaceHolder
来自布局 xml 中的 SurfaceView
。
如有任何帮助,我们将不胜感激!
创建于 iOS 的文件:
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'createdOnIOS.mp4':
Metadata:
major_brand : mp42
minor_version : 1
compatible_brands: mp41mp42isom
creation_time : 2015-02-20 08:01:30
Duration: 00:00:06.34, start: 0.000000, bitrate: 1577 kb/s
Stream #0:0(und): Video: h264 (Baseline) (avc1 / 0x31637661), yuv420p(tv, smpte170m), 360x480, 1509 kb/s, 29.98 fps, 29.97 tbr, 600 tbn, 1200 tbc (default)
Metadata:
creation_time : 2015-02-20 08:01:30
handler_name : Core Media Video
Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 63 kb/s (default)
Metadata:
creation_time : 2015-02-20 08:01:30
handler_name : Core Media Audio
创建于 Android 的文件:
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'createdOnAndroid.mp4':
Metadata:
major_brand : isom
minor_version : 0
compatible_brands: isom3gp4
creation_time : 2015-02-20 08:10:17
Duration: 00:00:06.08, start: 0.000000, bitrate: 6096 kb/s
Stream #0:0(eng): Video: h264 (Baseline) (avc1 / 0x31637661), yuv420p, 720x480, 6002 kb/s, SAR 65536:65536 DAR 3:2, 24.68 fps, 90k tbr, 90k tbn, 180k tbc (default)
Metadata:
rotate : 90
creation_time : 2015-02-20 08:10:17
handler_name : VideoHandle
encoder : MOTO
Side data:
displaymatrix: rotation of -90.00 degrees
Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)
Metadata:
creation_time : 2015-02-20 08:10:17
handler_name : SoundHandle
想通了! (好吧。)
在 android MediaPlayer
上有 OnVideoSizeChanged
的回调。我使用该回调来调整 UI 以确保视频宽高比正确显示。出于某种原因,在 iOS 视频中,调整视频视图的大小导致 OnVideoSizeChanged
再次被调用。这导致视图更新,调用 OnVideoSizeChanged
... 从而导致视图性能不佳。
简而言之,修复是:
public void onVideoSizeChanged(MediaPlayer mp, int width, int height)
{
if(mViewSize == null || mViewSize.x != width ||
mViewSize.y != height)
{
mViewSize = new Point(width, height);
updateViews();
}
}
我仍然不确定为什么 android 视频没有导致这种行为,但至少我想出了解决眼前问题的方法。
我有一个应用可以同时播放两个视频。在 MotoG (Android 4.4.4) 上,如果该应用正在播放在 Android 设备上生成的两个视频,则它可以正常工作。如果它正在播放 iOS 上生成的单个视频,则效果很好。
但是如果它正在播放在 iOS 上生成的 1 个视频和来自 iOS 或 Android 的第二个视频,播放器就会发疯并跳过和结结巴巴并且不会正常回放。
这两种文件格式之间存在细微差别,但由于这两种文件都可以自己正常播放,所以我认为这应该是 Android 需要解决的问题。以下是不同视频文件的 ffmpeg 信息。
如果有区别,MediaPlayers
会连接显示在 SurfaceHolder
上,该 SurfaceHolder
来自布局 xml 中的 SurfaceView
。
如有任何帮助,我们将不胜感激!
创建于 iOS 的文件:
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'createdOnIOS.mp4':
Metadata:
major_brand : mp42
minor_version : 1
compatible_brands: mp41mp42isom
creation_time : 2015-02-20 08:01:30
Duration: 00:00:06.34, start: 0.000000, bitrate: 1577 kb/s
Stream #0:0(und): Video: h264 (Baseline) (avc1 / 0x31637661), yuv420p(tv, smpte170m), 360x480, 1509 kb/s, 29.98 fps, 29.97 tbr, 600 tbn, 1200 tbc (default)
Metadata:
creation_time : 2015-02-20 08:01:30
handler_name : Core Media Video
Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 63 kb/s (default)
Metadata:
creation_time : 2015-02-20 08:01:30
handler_name : Core Media Audio
创建于 Android 的文件:
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'createdOnAndroid.mp4':
Metadata:
major_brand : isom
minor_version : 0
compatible_brands: isom3gp4
creation_time : 2015-02-20 08:10:17
Duration: 00:00:06.08, start: 0.000000, bitrate: 6096 kb/s
Stream #0:0(eng): Video: h264 (Baseline) (avc1 / 0x31637661), yuv420p, 720x480, 6002 kb/s, SAR 65536:65536 DAR 3:2, 24.68 fps, 90k tbr, 90k tbn, 180k tbc (default)
Metadata:
rotate : 90
creation_time : 2015-02-20 08:10:17
handler_name : VideoHandle
encoder : MOTO
Side data:
displaymatrix: rotation of -90.00 degrees
Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)
Metadata:
creation_time : 2015-02-20 08:10:17
handler_name : SoundHandle
想通了! (好吧。)
在 android MediaPlayer
上有 OnVideoSizeChanged
的回调。我使用该回调来调整 UI 以确保视频宽高比正确显示。出于某种原因,在 iOS 视频中,调整视频视图的大小导致 OnVideoSizeChanged
再次被调用。这导致视图更新,调用 OnVideoSizeChanged
... 从而导致视图性能不佳。
简而言之,修复是:
public void onVideoSizeChanged(MediaPlayer mp, int width, int height)
{
if(mViewSize == null || mViewSize.x != width ||
mViewSize.y != height)
{
mViewSize = new Point(width, height);
updateViews();
}
}
我仍然不确定为什么 android 视频没有导致这种行为,但至少我想出了解决眼前问题的方法。