【问题标题】:Live Stream Video Simultaneously on Facebook and Youtube在 Facebook 和 Youtube 上同时直播视频
【发布时间】:2018-03-26 07:24:38
【问题描述】:

我想制作一个可以使用他们的 API 将实时视频直接流式传输到 Facebook 和 YouTube 的 Android 应用。我已经完成了两个但单独的直播视频(一次一个)。但我想从手机摄像头同时将实时视频流式传输到两者(Facebook-YouTube)。 我使用这个库作为 RTMP Publisher - https://github.com/pedroSG94/rtmp-rtsp-stream-client-java。 我尝试过获取多个对象,但它无法处理这个。

【问题讨论】:

  • 你是怎么做到的?我也在寻找您已经实施的解决方案。
  • @ZaidMirza 我一次完成了一个直播视频,但我想同时在两个 fb/youtube 上流式传输,我现在无法进行
  • 你是如何一次完成的?我需要它
  • 文档已经可用。我仅通过参考文档来做到这一点
  • 你能同时流式传输吗,因为当我尝试做同样的事情时,我的应用程序屏幕变白了

标签: android facebook youtube stream live


【解决方案1】:

我是 rtmp-rtsp-stream-client-java 开发人员。

如果你想将重复的流发送到不同的服务器,你只需要重复的 srsFlvMuxer 或 rtspClient 取决于你的流类型。 例如,如果您使用的是 rtmpCamera1,则需要修改这个类,如下所示:

public class RtmpCamera1 extends Camera1Base {

  private SrsFlvMuxer srsFlvMuxer;
  private SrsFlvMuxer srsFlvMuxer2;

  public RtmpCamera1(SurfaceView surfaceView, ConnectCheckerRtmp connectChecker) {
    super(surfaceView);
    srsFlvMuxer = new SrsFlvMuxer(connectChecker);
    srsFlvMuxer2 = new SrsFlvMuxer(connectChecker);
  }

  public RtmpCamera1(TextureView textureView, ConnectCheckerRtmp connectChecker) {
    super(textureView);
    srsFlvMuxer = new SrsFlvMuxer(connectChecker);
    srsFlvMuxer2 = new SrsFlvMuxer(connectChecker);
  }

  @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
  public RtmpCamera1(OpenGlView openGlView, ConnectCheckerRtmp connectChecker) {
    super(openGlView);
    srsFlvMuxer = new SrsFlvMuxer(connectChecker);
    srsFlvMuxer2 = new SrsFlvMuxer(connectChecker);
  }

  @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
  public RtmpCamera1(LightOpenGlView lightOpenGlView, ConnectCheckerRtmp connectChecker) {
    super(lightOpenGlView);
    srsFlvMuxer = new SrsFlvMuxer(connectChecker);
    srsFlvMuxer2 = new SrsFlvMuxer(connectChecker);
  }

  /**
   * H264 profile.
   *
   * @param profileIop Could be ProfileIop.BASELINE or ProfileIop.CONSTRAINED
   */
  public void setProfileIop(byte profileIop) {
    srsFlvMuxer.setProfileIop(profileIop);
    srsFlvMuxer2.setProfileIop(profileIop);
  }

  @Override
  public void setAuthorization(String user, String password) {
    srsFlvMuxer.setAuthorization(user, password);
    srsFlvMuxer2.setAuthorization(user, password);
  }

  @Override
  protected void prepareAudioRtp(boolean isStereo, int sampleRate) {
    srsFlvMuxer.setIsStereo(isStereo);
    srsFlvMuxer.setSampleRate(sampleRate);
    srsFlvMuxer2.setIsStereo(isStereo);
    srsFlvMuxer2.setSampleRate(sampleRate);
  }

  @Override
  protected void startStreamRtp(String url) {
    if (videoEncoder.getRotation() == 90 || videoEncoder.getRotation() == 270) {
      srsFlvMuxer.setVideoResolution(videoEncoder.getHeight(), videoEncoder.getWidth());
      srsFlvMuxer2.setVideoResolution(videoEncoder.getHeight(), videoEncoder.getWidth());
    } else {
      srsFlvMuxer.setVideoResolution(videoEncoder.getWidth(), videoEncoder.getHeight());
      srsFlvMuxer2.setVideoResolution(videoEncoder.getWidth(), videoEncoder.getHeight());
    }
    srsFlvMuxer.start(url);
    //second url stream. For now hardcoded, modify this method to set in startStream library method.
    srsFlvMuxer2.start("rtmp://x.rtmp.youtube.com/xxxxxxxxx");   
  }

  @Override
  protected void stopStreamRtp() {
    srsFlvMuxer.stop();
    srsFlvMuxer2.stop();
  }

  @Override
  protected void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) {
    srsFlvMuxer.sendAudio(aacBuffer.duplicate(), info); //duplicate because you will reuse it on the second srsFlvMuxer.
    srsFlvMuxer2.sendAudio(aacBuffer, info);
  }

  @Override
  protected void onSPSandPPSRtp(ByteBuffer sps, ByteBuffer pps) {
    srsFlvMuxer.setSpsPPs(sps.duplicate(), pps.duplicate());//duplicate because you will reuse it on the second srsFlvMuxer.
    srsFlvMuxer2.setSpsPPs(sps, pps);
  }

  @Override
  protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) {
    srsFlvMuxer.sendVideo(h264Buffer.duplicate(), info);//duplicate because you will reuse it on the second srsFlvMuxer.
    srsFlvMuxer2.sendVideo(h264Buffer, info);
  }
}

【讨论】:

  • 如何处理诸如 getSentAudioFrames() 之类的重载方法,这些方法会返回一些值。它实际上不起作用。它只是在库中崩溃。
猜你喜欢
  • 2015-11-28
  • 1970-01-01
  • 2017-05-19
  • 1970-01-01
  • 2020-01-15
  • 2015-05-22
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
相关资源
最近更新 更多