Воспроизведение видео m3u8 в android

Я хочу жить потокового видео и в формате m3u8. Поэтому я попробовал приведенный ниже код

public class StreamingPlayer extends Activity implements
OnBufferingUpdateListener, OnCompletionListener,
OnPreparedListener, OnVideoSizeChangedListener, SurfaceHolder.Callback{

    private static final String TAG = StreamingPlayer.class.getSimpleName();
    private int mVideoWidth;
    private int mVideoHeight;
    private MediaPlayer mMediaPlayer;
    private SurfaceView mPreview;
    private SurfaceHolder holder;
    private String path;

    private boolean mIsVideoSizeKnown = false;
    private boolean mIsVideoReadyToBePlayed = false;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.mediaplayer_2);
        mPreview = (SurfaceView) findViewById(R.id.surface);
        holder = mPreview.getHolder();
        holder.addCallback(this);
        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    private void playVideo() {
        doCleanUp();
        try {

            /*
             * TODO: Set path variable to progressive streamable mp4 or
             * 3gpp format URL. Http protocol should be used.
             * Mediaplayer can only play "progressive streamable
             * contents" which basically means: 1. the movie atom has to
             * precede all the media data atoms. 2. The clip has to be
             * reasonably interleaved.
             * 
             */

            path = "httplive://xboodangx.api.channel.livestream.com/3.0/playlist.m3u8";

            if (path == "") {
                // Tell the user to provide a media file URL.
                Toast
                .makeText(
                        this,
                        "Please edit MediaPlayerDemo_Video Activity,"
                        + " and set the path variable to your media file URL.",
                        Toast.LENGTH_LONG).show();
            } 

            Log.e("PATH", "Path = " + path);
            // Create a new media player and set the listeners
            mMediaPlayer = new MediaPlayer();
            mMediaPlayer.setDataSource(path);
            mMediaPlayer.setDisplay(holder);
                    mMediaPlayer.setOnBufferingUpdateListener(this);
                    mMediaPlayer.setOnPreparedListener(this);
            mMediaPlayer.prepare();
            mMediaPlayer.setOnCompletionListener(this);
            mMediaPlayer.setOnVideoSizeChangedListener(this);
            mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

        } catch (Exception e) {
            Log.e(TAG, "error: " + e.getMessage(), e);
        }
    }

    public void onBufferingUpdate(MediaPlayer arg0, int percent) {
        Log.d(TAG, "onBufferingUpdate percent:" + percent);

    }

    public void onCompletion(MediaPlayer arg0) {
        Log.d(TAG, "onCompletion called");
    }

    public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
        Log.v(TAG, "onVideoSizeChanged called");
        if (width == 0 || height == 0) {
            Log.e(TAG, "invalid video width(" + width + ") or height(" + height + ")");
            return;
        }
        mIsVideoSizeKnown = true;
        mVideoWidth = width;
        mVideoHeight = height;
        if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) {
            startVideoPlayback();
        }
    }

    public void onPrepared(MediaPlayer mediaplayer) {
        Log.d(TAG, "onPrepared called");
        mIsVideoReadyToBePlayed = true;
        if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) {
            startVideoPlayback();
        }
    }

    public void surfaceChanged(SurfaceHolder surfaceholder, int i, int j, int k) {
        Log.d(TAG, "surfaceChanged called");

    }

    public void surfaceDestroyed(SurfaceHolder surfaceholder) {
        Log.d(TAG, "surfaceDestroyed called");
    }


    public void surfaceCreated(SurfaceHolder holder) {
        Log.d(TAG, "surfaceCreated called");
        playVideo();

    }

    @Override
    protected void onPause() {
        super.onPause();
        releaseMediaPlayer();
        doCleanUp();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        releaseMediaPlayer();
        doCleanUp();
    }

    private void releaseMediaPlayer() {
        if (mMediaPlayer != null) {
            mMediaPlayer.release();
            mMediaPlayer = null;
        }
    }

    private void doCleanUp() {
        mVideoWidth = 0;
        mVideoHeight = 0;
        mIsVideoReadyToBePlayed = false;
        mIsVideoSizeKnown = false;
    }

    private void startVideoPlayback() {
        Log.v(TAG, "startVideoPlayback");
        holder.setFixedSize(mVideoWidth, mVideoHeight);
        mMediaPlayer.start();
    }


}

В logcat показывает onBufferingUpdate percent:100 но я не вижу видео.

звук работает, но внезапно он был поражен.

и я попробовал это видео ссылка http://devimages.apple.com/iphone/samples/bipbop/gear1/prog_index.m3u8 это работает. Но моя видеосвязь не работает, и я изменил httplive://... instead of http:// но бесполезно.

и я видел это ответ Android видео поток mms и m3u8.

В приведенной выше ссылке он показывает, что видео не может быть воспроизведено сообщение.

6 ответов


видео существовало в http://www.livestream.com. В этом есть мобильный Api для live streaming.

Api:

http://www.livestream.com/userguide/index.php?title=Mobile_API#How_to_get_mobile_compatible_clips_from_a_channel.27s_library

в приведенной выше ссылке есть полная информация для мобильных совместимых. Чтобы получить RTSP-ссылку с канала, используйте это ссылка

http://xproshowcasex.channel-api.livestream-api.com/2.0/getstream

замените имя вашего канала вместо proshowcase. А затем получите все мобильные совместимые url-адреса, такие как IPhone, Android, Blackberry и т. д.,

используя этот url-адрес, вы можете транслировать видео в Android с помощью video view или media player.

для получения дополнительной информации, пожалуйста, прочитайте ссылку Mobile Api.

Если кто-то получит ту же проблему, я надеюсь, что этот ответ поможет вам.

удачи.


у меня нет проблем с воспроизведением потока:

videoView1.setVideoPath("http://***.net/livedemo/_definst_/stream3.stream/playlist.m3u8?wowzasessionid=773395207");
videoView1.start();

о сообщении:

видео не может быть воспроизведено

Возможно, вам нужно добавить разрешения в файл манифеста:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

Я думаю, вы должны переместить это:

mMediaPlayer.setOnPreparedListener(this);

быть до вызова prepare()


вы пытались воспроизвести свою ссылку с native player непосредственно через веб-браузер? Если вы не можете воспроизвести его с помощью native player, это означает, что ваш файл не поддерживается текущей версией Android. HTTP Live Streaming format может иметь некоторые особенности, которые не поддерживаются Android, в то время как он может играть на IOS.


Я пробовал формат видео m3u8 более 6 месяцев, и это не удалось. Он играет в моем приложении iPhone и родных приложениях. Мой потоковый сервер Red5 и не имеет RTSP-плагина. Он выдает RTMP streaming, и он не может быть передан в Android. Я ждал один год, чтобы получить ОС с поддержкой RTSP streaming, но google этого не сделал. Тем не менее, я использую веб-представление с flash player для потоковой передачи видео в реальном времени(у него не так много ясности). Мне стыдно говорить это моему клиенту и продолжение поиска для воспроизведения живого потока в проигрывателе Android по умолчанию.

Я думаю, что Ваш url видео может не RTSP.


как играть .M3u8 потокового в Android

activity_main.в XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <VideoView
        android:id="@+id/myVideoView"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

Main.java

package com.grexample.ooyalalive;

import java.net.URL;
import android.app.Activity;
import android.net.Uri;
import android.os.Bundle;
import android.widget.MediaController;
import android.widget.VideoView;

public class Main extends Activity {

    private String urlStream;
    private VideoView myVideoView;
    private URL url;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_vv);//***************
            myVideoView = (VideoView)this.findViewById(R.id.myVideoView);
            MediaController mc = new MediaController(this);
            myVideoView.setMediaController(mc);         
            urlStream = "http://jorgesys.net/i/irina_delivery@117489/master.m3u8";
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    myVideoView.setVideoURI(Uri.parse(urlStream)); 
                }
            });
    }
}

Я видел, что у многих людей есть проблемы с игрой .M3U8, это зависит от кодеков, используемых для потоковой передачи и совместимости с устройством, например, некоторые из моих .файлы m3u8 поддерживаются только в устройствах с экранами 1200 x800 и выше.