2014-07-18 14 views
1

로컬 멀티 캐스트 스트림이 있습니다. 비디오는 MPEG4 형식입니다. IP 주소를 호스트 (호스트) 및 멀티 캐스트 스트림 (포트) 얻을 수있는 포트 번호가 있습니다. 콘텐츠를 얻으려면 콘텐츠를 얻기 위해 멀티 캐스트 참가 요청을 보내고 연결해야합니다. Android에서 vitamio를 사용하여 멀티 캐스트 스트림 재생

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에서 어떤 오류가 발생하지 않는 다른 게시물 게시물 등 에의 전에 코드베이스의 일부를 몇 가지 문제가 있었지만, 나도 어떤 사진을하지 않습니다. 내 안드로이드 장치가 eth0 장치를 선택한 이유는 이더넷 소켓입니다. (다시, 장치 선택은 다른 게시물을 기반으로하므로 연결할 수 없습니다.) 어쩌면 누군가가 이것을 위해 Vitamio를 사용해 보았나요? 많은 스레드에서 Vitamio가 udp 스트림을 재생할 수있는 사람의 대답을 발견했지만, 결코 메신저가 아닌 방법, Vitamio 라이브러리 src 코드의 샘플 코드를 사용했습니다. 운없이.

답변

0

좋아, 그래서 알아 냈어. 먼저 setVideoUriVideoView에 들어가기 전에 그룹에 가입 할 필요가 없습니다. Vitamio를 사용할 때 udp 멀티 캐스트 (그룹 가입, 그룹 탈퇴 및 계속 청취 중임)로 필요한 전체 통신이 구현됩니다. 두 번째 것은 링크입니다. udp://HOST:PORT을 사용했지만 udp://@HOST:PORT (빈 사용자)이어야합니다. VLC에서 udp 스트림을 테스트하려고하면 @ 링크를 사용해야 재생할 수 있습니다.