首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Wowza的RTSP服务器实现Google glass直播视频

用Wowza的RTSP服务器实现Google glass直播视频
EN

Stack Overflow用户
提问于 2014-08-12 18:56:12
回答 1查看 1K关注 0票数 2

我正在尝试构建一个支持直播的谷歌眼镜应用程序。我知道Livestream应用程序可以做到这一点,但我不认为我们可以将其集成到我们的应用程序中,或者我错了?有没有办法将直播流集成到我们的应用程序中?

我偶然发现了这个https://github.com/andermaco/GlassStream开源项目,它使用Wowza的RTSP服务器做同样的事情。按照说明,我已经给出了用户名/密码并更新了url。但是在运行的过程中,运行应用程序时出现了一个问题。我尝试过调试它,但是没有成功。这是我反复得到的日志

android.media.MediaCodec.dequeueOutputBuffer(Native方法的java.lang.IllegalStateException )在net.majorkernelpanic.streaming.rtp.MediaCodecInputStream.read(MediaCodecInputStream.java :75)在java.lang.Thread.run的net.majorkernelpanic.streaming.rtp.AACLATMPacketizer.run(AACLATMPacketizer.java:88) (Thread.java:841)

一些用户已经使用,并取得了成功,请分享我的源代码或让我知道,如果我错过了在设置服务器。即使有任何其他资源可以实现,那也是很棒的。

提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2015-02-09 19:19:37

这是我用来让它在谷歌眼镜(XE22)上使用Wowza媒体服务器和libstreaming工作的代码。

我有两个类AppConfigMyActivity

AppConfig:

代码语言:javascript
复制
package com.example.GlassApp;

/**
 * User: Colin Shewell
 * Date: 21/08/14
 * Time: 15:30
 */
public class AppConfig {
  public static final String STREAM_URL = "rtsp://193.61.148.73:1935/serg/android_test";
  //public static final String STREAM_URL = "rtsp://192.168.2.2:1935/serg/android_test";
  public static final String PUBLISHER_USERNAME = "";
  public static final String PUBLISHER_PASSWORD = "";
}

MyActivity:

代码语言:javascript
复制
    package com.example.GlassApp;

/**
 * User: Colin Shewell
 * Date: 21/08/14
 * Time: 15:30
 */
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;

    import net.majorkernelpanic.streaming.Session;
    import net.majorkernelpanic.streaming.SessionBuilder;
    import net.majorkernelpanic.streaming.audio.AudioQuality;
    import net.majorkernelpanic.streaming.gl.SurfaceView;
    import net.majorkernelpanic.streaming.rtsp.RtspClient;
    import android.app.Activity;
    import android.app.AlertDialog;
    import android.content.DialogInterface;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.SurfaceHolder;
    import android.view.Window;
    import android.view.WindowManager;
    import net.majorkernelpanic.streaming.video.VideoQuality;

    public class MyActivity extends Activity implements RtspClient.Callback, Session.Callback, SurfaceHolder.Callback {
      // log tag
      public final static String TAG = MyActivity.class.getSimpleName();

      // surfaceview
      private static SurfaceView mSurfaceView;

      // Rtsp session
      private Session mSession;
      private static RtspClient mClient;

      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        // getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
        requestWindowFeature(Window.FEATURE_NO_TITLE);

        setContentView(R.layout.activity_main);

        mSurfaceView = (SurfaceView) findViewById(R.id.surface);

        mSurfaceView.getHolder().addCallback(this);

        // Initialize RTSP client
        initRtspClient();
      }

      @Override
      protected void onResume() {
        super.onResume();

        toggleStreaming();
      }

      @Override
      protected void onPause(){
        super.onPause();

        toggleStreaming();
      }

      private void initRtspClient() {
        // Configures the SessionBuilder
        mSession = SessionBuilder.getInstance()
            .setContext(getApplicationContext())
            .setAudioEncoder(SessionBuilder.AUDIO_NONE)
            .setVideoEncoder(SessionBuilder.VIDEO_H264)
            .setVideoQuality(new VideoQuality(640, 480, 20, 500000)) //only need if you want to change the resolution from default
            .setSurfaceView(mSurfaceView).setPreviewOrientation(0)
            .setCallback(this).build();

        // Configures the RTSP client
        mClient = new RtspClient();
        mClient.setSession(mSession);
        mClient.setCallback(this);
        mSurfaceView.setAspectRatioMode(SurfaceView.ASPECT_RATIO_PREVIEW);
        String ip, port, path;

        // We parse the URI written in the Editext
        Pattern uri = Pattern.compile("rtsp://(.+):(\\d+)/(.+)");  
        Matcher m = uri.matcher(AppConfig.STREAM_URL);
        m.find();
        ip = m.group(1);
        port = m.group(2);
        path = m.group(3);

        mClient.setCredentials(AppConfig.PUBLISHER_USERNAME,
            AppConfig.PUBLISHER_PASSWORD);
        mClient.setServerAddress(ip, Integer.parseInt(port));
        mClient.setStreamPath("/" + path);
      }

      private void toggleStreaming() {
        if (!mClient.isStreaming()) {
          // Start camera preview
          mSession.startPreview();

          // Start video stream
          mClient.startStream();
        } else {
          // already streaming, stop streaming
          // stop camera preview
          mSession.stopPreview();

          // stop streaming
          mClient.stopStream();
        }
      }

      @Override
      public void onDestroy() {
        super.onDestroy();
        mClient.release();
        mSession.release();
        mSurfaceView.getHolder().removeCallback(this);
      }

      @Override
      public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
      }

      @Override
      public void onSessionError(int reason, int streamType, Exception e) {
        switch (reason) {
          case Session.ERROR_CAMERA_ALREADY_IN_USE:
            break;
          case Session.ERROR_CAMERA_HAS_NO_FLASH:
            break;
          case Session.ERROR_INVALID_SURFACE:
            break;
          case Session.ERROR_STORAGE_NOT_READY:
            break;
          case Session.ERROR_CONFIGURATION_NOT_SUPPORTED:
            break;
          case Session.ERROR_OTHER:
            break;
        }

        if (e != null) {
          alertError(e.getMessage());
          e.printStackTrace();
        }
      }

      private void alertError(final String msg) {
        final String error = (msg == null) ? "Unknown error: " : msg;
        AlertDialog.Builder builder = new AlertDialog.Builder(MyActivity.this);
        builder.setMessage(error).setPositiveButton("Ok",
            new DialogInterface.OnClickListener() {
              public void onClick(DialogInterface dialog, int id) {
              }
            });
        AlertDialog dialog = builder.create();
        dialog.show();
      }

      @Override
      public void onRtspUpdate(int message, Exception exception) {
        switch (message) {
          case RtspClient.ERROR_CONNECTION_FAILED:
          case RtspClient.ERROR_WRONG_CREDENTIALS:
            alertError(exception.getMessage());
            exception.printStackTrace();
            break;
        }
      }

      @Override
      public void onPreviewStarted() {
      }

      @Override
      public void onSessionConfigured() {
      }

      @Override
      public void onSessionStarted() {
      }

      @Override
      public void onSessionStopped() {
      }

      @Override
      public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
      }

      @Override
      public void surfaceCreated(SurfaceHolder holder) {
      }

      @Override
      public void surfaceDestroyed(SurfaceHolder holder) {
      }

      // @Override
      public void onBitrateUpdate(long bitrate) {
      }
    }

编辑:我可以确认以下视频质量设置有效:

代码语言:javascript
复制
.setVideoQuality(new VideoQuality(640, 480, 20, 500000))
.setVideoQuality(new VideoQuality(960, 720, 20, 500000))

我还想补充说,fps值超过20似乎会导致应用程序无法启动。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25262526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档