Подтвердить что ты не робот

Воспроизведение видео 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.

В приведенной выше ссылке показано, что видео не воспроизводится.

4b9b3361

Ответ 1

Видео существовало в http://www.livestream.com. В этом есть Mobile Api для прямой трансляции.

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 с помощью видео-просмотра или медиаплеера.

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

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

Желаем удачи.

Ответ 2

У меня нет проблем играть в поток:

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"/>

Ответ 3

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

mMediaPlayer.setOnPreparedListener(this);

Перед вызовом prepare()

Ответ 4

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

Ответ 5

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

Я думаю, что ваш URL-адрес видео может не быть RTSP.

Ответ 6

Как играть .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/[email protected]/master.m3u8";
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    myVideoView.setVideoURI(Uri.parse(urlStream)); 
                }
            });
    }
}

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