Package org.red5.app.sip.stream

Source Code of org.red5.app.sip.stream.TalkStream

package org.red5.app.sip.stream;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;

import org.apache.mina.core.buffer.IoBuffer;
import org.red5.app.sip.RtmpAudioData;
import org.red5.app.sip.trancoders.Transcoder;
import org.red5.logging.Red5LoggerFactory;
import org.red5.server.api.scope.IScope;
import org.red5.server.api.stream.IBroadcastStream;
import org.red5.server.api.stream.IStreamListener;
import org.red5.server.api.stream.IStreamPacket;
import org.red5.server.net.rtmp.event.AudioData;
import org.red5.server.net.rtmp.event.SerializeUtils;
import org.slf4j.Logger;

public class TalkStream {
  private final static Logger log = Red5LoggerFactory.getLogger(TalkStream.class, "sip");

  private final Transcoder transcoder;
  private final RtpStreamSender rtpSender;
  private final IStreamListener mInputListener;
 
  private BlockingQueue<RtmpAudioData> packets = new LinkedBlockingQueue<RtmpAudioData>();
  private final Executor exec = Executors.newSingleThreadExecutor();
  private Runnable audioProcessor;
  private volatile boolean processAudio = false;
 
  private final String talkStreamName;
 
  public TalkStream(final Transcoder transcoder, final RtpStreamSender rtpSender) {
    this.transcoder = transcoder;
    this.rtpSender = rtpSender;
    talkStreamName = "microphone_" + System.currentTimeMillis();
   
    mInputListener = new IStreamListener() {
      public void packetReceived(IBroadcastStream broadcastStream, IStreamPacket packet) {
          IoBuffer buf = packet.getData();
          if (buf != null)
          buf.rewind();
       
          if (buf == null || buf.remaining() == 0){
          log.debug("skipping empty packet with no data");
          System.out.println("skipping empty packet with no data");
          return;
          }
             
          if (packet instanceof AudioData) {
          try {
                byte[] data = SerializeUtils.ByteBufferToByteArray(buf);
                RtmpAudioData audioData = new RtmpAudioData(data);
//                System.out.println("Adding data " + data.length);
          packets.put(audioData);
          } catch (InterruptedException e) {
          log.info("Interrupted exception while queieing audio packet");
          }               
          }
      }
    };       
  }
 
  public void start(IBroadcastStream broadcastStream, IScope scope) {
      log.debug("startTranscodingStream({},{})", broadcastStream.getPublishedName(), scope.getName());
      broadcastStream.addStreamListener(mInputListener);
     
      processAudio = true;
      audioProcessor = new Runnable() {
      public void run() {
        while (processAudio) {
          try {
            RtmpAudioData packet = packets.take();
            processAudioPacket(packet);
          } catch (InterruptedException e) {
            log.info("InterruptedExeption while taking audio packet.");
          }
        }
      }
    };
    exec.execute(audioProcessor);     
  }
 
  private void processAudioPacket(RtmpAudioData packet) {
    byte[] data = packet.getData();
//    System.out.println("Proccessing voice data");
        rtpSender.send(data, 1, data.length-1);
  }
 
  public void stop() {
    processAudio = false;   
  }
 
  public String getStreamName() {
    return talkStreamName;
  }
}
TOP

Related Classes of org.red5.app.sip.stream.TalkStream

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.