我正在开发一个 android 应用程序,它播放来自我们服务器的 iphone 和 android 上传的视频,问题是 iphone 录制的视频是 .mov 格式,android 不支持。我搜索了很多,但找不到任何解决方案。帮帮我。提前致谢 :)
问问题
4821 次
1 回答
0
我会建议您将格式从 iphone 更改为兼容的(即使打开会更好),因为服务器上两种不同格式的视频迟早会令人头疼。
如果可以,请使用ffmpeg重新格式化您的视频,并将其全部以相同的格式保存在服务器上。
如果你做不到或者很难实现,你可以试试谷歌的 ExoPlayer 组件。我已经尝试过像您这样的应用程序,设备(iPhone 和 Android)在其中录制视频并上传到服务器。在服务器端重新格式化所有这些视频几乎是不可能的,因此我们最终决定在客户端为遗留视频应用解决方案。
https://google.github.io/ExoPlayer/
ExoPlayer 的设置比 VideoView 大,但操作起来很简单。
private var player: ExoPlayer = initPlayer()
private fun initPlayer(): ExoPlayer {
val bandwidthMeter = DefaultBandwidthMeter()
val videoTrackSelectionFactory = AdaptiveTrackSelection.Factory(bandwidthMeter)
val trackSelector = DefaultTrackSelector(videoTrackSelectionFactory)
return ExoPlayerFactory.newSimpleInstance(context, trackSelector)
}
fun setup() {
videoExo.setPlayer(player)
videoExo.useController = false
val dataSourceFactory = DefaultDataSourceFactory(
context,
Util.getUserAgent(context, context?.packageName), DefaultBandwidthMeter()
)
val videoSource = ExtractorMediaSource.Factory(dataSourceFactory).createMediaSource(videoUri)
player.addListener(object: Player.EventListener {
override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) {
if (playbackState == Player.STATE_READY) {
startCallback()
}
}
override fun onPlaybackParametersChanged(playbackParameters: PlaybackParameters?) {}
override fun onSeekProcessed() {}
override fun onTracksChanged(trackGroups: TrackGroupArray?, trackSelections: TrackSelectionArray?) {}
override fun onPlayerError(error: ExoPlaybackException?) {}
override fun onLoadingChanged(isLoading: Boolean) {}
override fun onPositionDiscontinuity(reason: Int) {}
override fun onRepeatModeChanged(repeatMode: Int) {}
override fun onShuffleModeEnabledChanged(shuffleModeEnabled: Boolean) {}
override fun onTimelineChanged(timeline: Timeline?, manifest: Any?, reason: Int) {}
})
player.prepare(videoSource)
player.playWhenReady = true
player.repeatMode = REPEAT_MODE_ALL
}
希望这可以帮助
于 2018-04-13T12:02:20.500 回答