学习过程:Red5(四)

以下是red5服务器端的代码,接受H264编码的视频流,发送协议是RTMP。

 

import java.io.File;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import org.apache.mina.core.buffer.IoBuffer;
import org.red5.io.IStreamableFile;
import org.red5.io.IStreamableFileFactory;
import org.red5.io.IStreamableFileService;
import org.red5.io.ITag;
import org.red5.io.ITagWriter;
import org.red5.io.StreamableFileFactory;
import org.red5.io.flv.impl.Tag;
import org.red5.server.adapter.MultiThreadedApplicationAdapter;
import org.red5.server.api.IClient;
import org.red5.server.api.IConnection;
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.api.stream.ISubscriberStream;
import org.red5.server.util.ScopeUtils;

public class MyApplicationAdapter extends MultiThreadedApplicationAdapter {
 
 private Map<String, MyStreamListener> map = new ConcurrentHashMap<String, MyStreamListener>();
 
 @Override
 public void streamPublishStart(IBroadcastStream stream) {

  System.out.println("-------------streamPublishStart---------------------");
  
  String publishedName = stream.getPublishedName();  
  MyStreamListener myStreamListener = new MyStreamListener(publishedName, this.scope);  
  map.put(publishedName, myStreamListener); 
  stream.addStreamListener(myStreamListener);
  
  super.streamPublishStart(stream);
  
 }
 
 class MyStreamListener implements IStreamListener {
  
  private int startTimeStamp = -1;
  private ITagWriter writer = null;
  private File file;
  
  MyStreamListener (String publishedName, IScope scope) {
   init(publishedName, scope);
  }
  
  private void init(String publishedName, IScope scope) {
    
   try {
    file = new File("C:/Program Files/Red5/webapps/FirstVideoDemo/streams/"+ publishedName +"_"+System.currentTimeMillis() +"_a.flv");

    IStreamableFileFactory factory = (IStreamableFileFactory) ScopeUtils
      .getScopeService(scope, IStreamableFileFactory.class,
        StreamableFileFactory.class);

    if (!this.file.isFile()) {
     // Maybe the (previously existing) file has been deleted
     this.file.createNewFile();
    } else if (!file.canWrite()) {
     throw new IOException("The file is read-only");
    }
    
    IStreamableFileService service = factory.getService(this.file);
    IStreamableFile flv = service.getStreamableFile(this.file);
    this.writer = flv.getWriter();
    
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
 
  void close() {
   writer.close();
  }
  
  @Override
  public void packetReceived(IBroadcastStream stream, IStreamPacket packet) {
   
   int timeStamp = packet.getTimestamp();
   IoBuffer data = packet.getData().asReadOnlyBuffer();

         if (data.limit() == 0) {
             return;
         }

         if (startTimeStamp == -1) {
             // That will be not bigger then long value
             startTimeStamp = packet.getTimestamp();
         }

         timeStamp -= startTimeStamp;
         ITag tag = new Tag();
         tag.setDataType(packet.getDataType());
         tag.setBodySize(data.limit());
         tag.setTimestamp(timeStamp);
         tag.setBody(data);

         try {
    writer.writeTag(tag);
   } catch (IOException e) {
    e.printStackTrace();
   }
        
  }
 }
 
 @Override
 public void streamBroadcastStart(IBroadcastStream stream) {
  System.out.println("-------------streamBroadcastStart---------------------");
  super.streamBroadcastStart(stream);
//  String publishName=stream.getPublishedName();
//  ISharedObject iso=getSharedObject(scope, publishName);
//  if (iso==null) {
//   createSharedObject(scope, publishName, true);
//             iso = getSharedObject(scope, publishName);
//  }
//  iso.setAttribute("hasStream", true);
 }
  
 @Override
 public void streamBroadcastClose(IBroadcastStream stream) {
  System.out.println("-------------streamBroadcastClose---------------------");
  
  String publishedName = stream.getPublishedName();
  MyStreamListener myListener = map.get(publishedName);
  if (null != myListener) {
   myListener.close();

   map.remove(publishedName);
  }
  super.streamBroadcastClose(stream);
 }
 
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值