如何在安卓设备上从URL播放流媒体视频?

4

我希望在安卓设备上从网站播放流视频。

例如,我希望从这个URL播放流视频:http://florotv.com/canal2.html

使用URL Helper,我已经能够捕获RTMP URL:

rtmp://198.144.153.139:443/kuyo<playpath>ver44?id=acf6f5271f8ce567ed6c8737ce85a044&pid=32342e3136362e37332e323139 <swfUrl>http://yukons.net/yplay2.swf <pageUrl>http://yukons.net/embed/37363635373233343334/eeff74c57593ca38defc902fa6d88005/600/400

现在我有这个URL,我想知道在安卓上是否有可能播放视频。
我已经尝试过这个方法,但是它不起作用,因为我不知道如何设置swfUrl、pageUrl等参数。
private static final String MOVIE_URL="rtmp://198.144.153.139:443/kuyo";
Intent intent = new Intent(android.content.Intent.ACTION_VIEW);
Uri data = Uri.parse(MOVIE_URL);
intent.setData(data);
startActivity(intent);

提前感谢您...

4个回答

2
将以下代码添加到您的Activity.java文件中。
protected void onCreate(Bundle savedInstanceState)
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.videoPlayer);
try {        
    String link="http://videocloud/video.mp4";
    VideoView videoView = (VideoView) findViewById(R.id.myVideoView);
    final ProgressBar pbLoading = (ProgressBar) findViewById(R.id.pbVideoLoading);
    pbLoading.setVisibility(View.VISIBLE);
    MediaController mediaController = new MediaController(this);
    mediaController.setAnchorView(videoView);
    Uri video = Uri.parse(link);
    videoView.setMediaController(mediaController);
    videoView.setVideoURI(video);
    videoView.start();
    videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                        @Override
                        public void onPrepared(MediaPlayer mp) {
                            pbLoading.setVisibility(View.GONE);
                        }
    });
} catch (Exception e) {
    // TODO: handle exception
    Toast.makeText(this, "Error connecting", Toast.LENGTH_SHORT).show();
}

如果您不需要MediaController,请将其设置为null:videoView.setMediaController(null)

0

使用来自Google的最新、流媒体强化SDK,并避免设备版本和制造商之间的实现差异,请选择AndroidX的 Media 2/3 ExoPlayer 库。以下是Kotlin的一个简单示例:

class FullScreenVideoActivity : AppCompatActivity(R.layout.activity_full_screen_video) {

    private var player: ExoPlayer? = null

    private var playWhenReady: Boolean = true
    private var playbackPosition: Long = 0

    override fun onCreate(savedInstanceState: Bundle?) {
        PregnancyApp.component().inject(this)
        super.onCreate(savedInstanceState)

        playWhenReady = savedInstanceState?.getBoolean(::playWhenReady.name) ?: playWhenReady
        playbackPosition = savedInstanceState?.getLong(::playbackPosition.name) ?: playbackPosition

        closeIcon.setOnClickListener { finish() }
        playerView.setControllerVisibilityListener(
            StyledPlayerView.ControllerVisibilityListener { visibility -> closeIcon.visibility = visibility }
        )
    }

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)

        outState.putBoolean(::playWhenReady.name, playWhenReady)
        outState.putLong(::playbackPosition.name, playbackPosition)
    }

    override fun onStart() {
        super.onStart()
        initializePlayer()
    }

    override fun onStop() {
        super.onStop()
        releasePlayer()
    }

    private fun initializePlayer() {
        player = ExoPlayer.Builder(this)
            .build()
            .also { exoPlayer ->
                playerView.player = exoPlayer
                val mediaItem = MediaItem.fromUri(Uri.parse("http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/TearsOfSteel.mp4"))
                exoPlayer.setMediaItem(mediaItem)
                exoPlayer.playWhenReady = playWhenReady
                exoPlayer.seekTo(0, playbackPosition)
                exoPlayer.prepare()
                exoPlayer.addAnalyticsListener(object : AnalyticsListener {

                    override fun onPlayerError(eventTime: AnalyticsListener.EventTime, error: PlaybackException) {
                        Timber.e(error)
                    }

                })
            }
    }

    private fun releasePlayer() {
        player?.let { exoPlayer ->
            playbackPosition = exoPlayer.currentPosition
            playWhenReady = exoPlayer.playWhenReady
            exoPlayer.release()
        }
        player = null
    }

}

以及布局文件:

<?xml version="1.0" encoding="utf-8"?>

<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/rootLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/black"
    >

    <com.google.android.exoplayer2.ui.StyledPlayerView
        android:id="@+id/playerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />

    <!-- This inner layout here is required to place the back icon below the top system bar (android:fitsSystemWindows="true")
         while keeping the entire fragment full-screen. -->
    <FrameLayout
        android:id="@+id/backContainer"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        android:fitsSystemWindows="true"
        android:elevation="4dp"
        >

        <ImageView
            android:id="@+id/closeIcon"
            android:layout_width="64dp"
            android:layout_height="64dp"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            android:padding="16dp"
            android:src="@drawable/ic_close_blue_on_semitransparent"
            android:contentDescription="@string/close"
            android:background="?selectableItemBackgroundBorderless"
            />

    </FrameLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

0

我认为仅仅创建一个意图是不够的,你还需要为视频创建一个上下文,例如一个VideoView对象。

以下链接提供了一种解决方案: http://androidcodeexamples.blogspot.sg/2011/08/how-to-play-mp4-video-in-android-using.html

基本上,使用VideoView对象创建一个MediaController对象。然后,一旦设置URI,就可以使用VideoView启动操作。

编辑: 但是,您的URL包含POST参数,不是资源(在此情况下是视频文件)的唯一标识符,这可能是主要问题。

'swfUrl'和'pageUrl'参数很可能是提供页面的服务器独有的。


谢谢你的回答。不过,我已经用这个变量MOVIE_URL="rtmp://musicbox.cdnvideo.ru/musicbox-live/musicbox.sdp"测试了我的代码,它完美地运行了。 - user3167333
在这种情况下,您是否尝试将您捕获的整个rtmp URL分配给MOVIE_URL变量? - jlouzado

0

你可以在Android中使用Vitamio库,其中你可以设置swfUrl和pageUrl。

这里有一个tutorial供参考。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接