RTMP视频流——推拉流及视频保存

视频录制

下面的案例是录制MP4的,inputFile是直播的地址,outputFile是保存的地址

public static void frameRecord(String inputFile, String outputFile)
          {
              int width=1920;
              int height=1080;
        // 获取视频源
        log.info("地址:"+inputFile);
        FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(inputFile);
        // 如果不设置成tcp连接时,默认使用UDP,丢包现象比较严重
        grabber.setOption("rtmp_transport", "tcp"); // 设置成tcp以后比较稳定
        grabber.setImageWidth(width);
        grabber.setImageHeight(height);
        grabber.setOption("rtmp_buffer", "1000");
        // 流媒体输出地址,分辨率(长,高),是否录制音频(0:单声道/1:多声道)
        //FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(outputFile, width,             //height,0);
        //当然,也可以不加
        FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(outputFile, width,             height);
        recorder.setInterleaved(true);
        recorder.setVideoOption("crf","18"); //压缩画质 降低大小 18 为百分之21 51压缩为百分之97
        recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);//设置视频解码器
        recorder.setFormat("mp4");
    //    recorder.setFormat("flv"); // rtmp的类型
    //   recorder.setAudioCodec(grabber.getAudioCodec());
        recorder.setFrameRate(25);//25帧
        recorder.setImageWidth(width);
        recorder.setImageHeight(height);
        log.info("开始录制视频");
        // 开始取视频源
        recordByFrame(grabber, recorder);
    }

    private static void recordByFrame(FFmpegFrameGrabber grabber, FFmpegFrameRecorder recorder)
    {
    //记得用Thread ,不然会出现其他接口用不了情况
        new Thread(()->{
            try {
                grabber.start();
                recorder.start();
                //用于记录重新连接次数
                int count = 0;
                while(true){
                    count++;
                    Frame frame;
                    frame=grabber.grabImage();
                    if(frame == null){
                        log.info("获取不到 连接");
                        if(count % 100 == 0){
                            log.error("重连次数="+count);
                            if(count % 1000 == 0){
                                log.info("退出循环");
                                break;
                            }}
                        continue;
                    }
                    count=0;
                    recorder.record(frame);
                }
                grabber.stop();
                grabber.release();
                recorder.stop();
                recorder.release();
                log.info("结束录制");
            }catch (Exception e){
                log.error(e.getMessage());
            }
        }).start();

    }

标题

user root;
worker_processes  1;
 
error_log  logs/error.log debug;
 
events {
    worker_connections  1024;
}
 
rtmp {
    server {
        listen 1935;
        application myapp {
            //开启直播
            live on;
            //开启hls
            hls on;
            //hls保存地址
     		hls_path /xxx/; 
     		//每个断片时长
     		hls_fragment 5s;
     		//可播放长度
     		hls_playlist_length 30s;
     		//全部人都可以推送视频到服务器
     		allow play all;
        }
    }
}
http {
    server {
        listen      8081;
        location /stat {
            rtmp_stat all;
            rtmp_stat_stylesheet stat.xsl;
        }
       

各协议优缺点:
各协议优缺点

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值