1

ローカル マルチキャスト ストリームがあります。動画はMPEG4です。ホスト (HOST) の IP アドレスと、マルチキャスト ストリーム (PORT) を取得できるポート番号があります。コンテンツを取得するには、接続してマルチキャスト参加要求を送信し、コンテンツを取得する必要があります。

import io.vov.vitamio.MediaPlayer;
import io.vov.vitamio.widget.MediaController;
import io.vov.vitamio.widget.VideoView;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.MulticastSocket;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Enumeration;

import android.app.Activity;
import android.content.Context;
import android.net.Uri;
import android.net.wifi.WifiManager;
import android.os.AsyncTask;
import android.os.Bundle;

public class MainActivity extends Activity {
    private static final String HOST = "192.168.1.1";
    private static final int PORT = 1234;
    int port;
    InetAddress address;
    DatagramSocket socket = null;
    DatagramPacket packet;
    byte[] sendBuf = new byte[256];
    private VideoView mVideoView;

    private MediaController mMediaController;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
            if (wifi != null) {
                WifiManager.MulticastLock lock = wifi.createMulticastLock("mylock");
                lock.acquire();
            }
            mVideoView = (VideoView) findViewById(R.id.video);
            mMediaController = new MediaController(this);

            mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mediaPlayer) {
                    // optional need Vitamio 4.0
                    mediaPlayer.setPlaybackSpeed(1.0f);
                }
            });
        }

        @Override
        protected void onResume() {
            super.onResume();
            new AsyncTask<Void, Void, Void>() {
                @Override
                protected Void doInBackground(Void... params) {
                    try {
                        Enumeration<NetworkInterface> enumeration = NetworkInterface.getNetworkInterfaces();
                        NetworkInterface eth0 = null;
                        while (enumeration.hasMoreElements()) {
                            eth0 = enumeration.nextElement();
                            if (eth0.getName().equals("eth0")) {
                                // there is probably a better way to find ethernet
                                // interface
                                break;
                            }
                        }

                        InetAddress group = InetAddress.getByName(HOST);
                        MulticastSocket s = new MulticastSocket(PORT);
                        s.setReuseAddress(true);
                        s.setTimeToLive(1);
                        s.setSoTimeout(10000);
                        s.joinGroup(new InetSocketAddress(group, PORT), eth0);
                        Log.log("JOINED GROUP");
                        byte[] msg = {
                            'H', 'e', 'l', 'l', 'o'
                        };
                        DatagramPacket hi = new DatagramPacket(msg, msg.length, group, TVP_HD_PORT);
                        s.send(hi);
                        Log.log("SENT HI TO GROUP")

                        mVideoView.setVideoURI(Uri.parse("udp://" + HOST + ":" + PORT));
                        mVideoView.setMediaController(mMediaController);
                        mVideoView.requestFocus();
                    } catch (SocketException e) {
                        Log.log("FAIL");
                        e.printStackTrace();
                    } catch (UnknownHostException e) {
                        Log.log("FAIL");
                        e.printStackTrace();
                    } catch (IOException e) {
                        Log.log("FAIL");
                        e.printStackTrace();
                    }

                    return null;
                }
            }.execute();
        }
    }
}

他の投稿からの投稿などのコードベースのいくつかの前に、いくつかの問題がありました.Vitamioからエラーは発生しませんが、画像も得られません. 私の Android デバイスにはイーサネット ソケットがあるため、eth0 デバイスを選択しました (繰り返しますが、デバイスの選択は他の投稿に基づいており、それなしでは接続できませんでした)。多分誰かがこれに Vitamio を使ってみた? 多くのスレッドで、Vitamio は udp ストリームを再生できるという 1 人の回答を見つけましたが、その方法については言及しませんでした。Vitamio ライブラリの src コードのサンプル コードを使用しました。運がなければ。

4

1 に答える 1

0

わかりましたので、私はそれを理解しました。まず、 に入る前setVideoUriにグループに参加する必要はありませんVideoView。Vitamio を使用すると、udp マルチキャストに必要な通信全体 (グループに参加し、グループを脱退し、まだリッスンしていることを確認する) が実装されます。2つ目はリンクです。使用しましたが、 (空のユーザー)udp://HOST:PORTである必要があります。udp://@HOST:PORTVLC で udp ストリームをテストしようとする場合は、それ@を再生するために link も使用する必要があります。

于 2014-07-25T08:40:28.880 に答える