基于ffmpeg的直播引流视屏存储

这份代码主要是根据直播地址录像保存到指定的位置
1、什么是ffmpeg?
转载一篇详细的介绍点我了解ffmpeg
话不多说直接上代码

package com.project.utils;

import java.io.File;
import java.io.IOException;
import java.util.UUID;

import org.bytedeco.javacpp.avcodec;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.FFmpegFrameRecorder;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.FrameGrabber;
import org.bytedeco.javacv.FrameRecorder;

/**
 * 抓取摄像头设备直播视屏
 */
public class RecordVideoThread extends Thread {


    public String streamURL;// 流地址
    public String filePath;// 文件路径


    public void setStreamURL(String streamURL) {
        this.streamURL = streamURL;
    }
    public void setFilePath(String filePath) {
        this.filePath = filePath;
    }
    @Override
    public void run() {
        System.out.println(streamURL);

        // 获取视频源
        FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(streamURL);

        FFmpegFrameRecorder recorder = null;
        try {
            grabber.start();
            Frame frame = grabber.grabFrame();
            if (frame != null) {
                File outFile = new File(filePath);
                if (!outFile.isFile()) {
                    try {
                        outFile.createNewFile();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                // 流媒体输出地址,分辨率(长,高),是否录制音频(0:不录制/1:录制)
                recorder = new FFmpegFrameRecorder(filePath, 2048, 1536, 1);
                recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);// 直播流格式
                recorder.setFormat("flv");// 录制的视频格式
                recorder.setFrameRate(25);// 帧数
                //百度翻译的比特率,默认400000,但是我400000贼模糊,调成800000比较合适
                recorder.setVideoBitrate(800000);
                recorder.start();
                while ((frame != null)) {
                    recorder.record(frame);// 录制
                    frame = grabber.grabFrame();// 获取下一帧
                }
                recorder.record(frame);
                // 停止录制
                recorder.stop();
                grabber.stop();
            }
        } catch (FrameGrabber.Exception e) {
            e.printStackTrace();
        } catch (FrameRecorder.Exception e) {
            e.printStackTrace();
        } finally {
            if (null != grabber) {
                try {
                    grabber.stop();
                } catch (FrameGrabber.Exception e) {
                    e.printStackTrace();
                }
            }
            if (recorder != null) {
                try {
                    recorder.stop();
                } catch (FrameRecorder.Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void main(String[] args) {
        while(true){

            Thread t=new Thread();

            try{

                RecordVideoThread thread = new RecordVideoThread();
                //文件名
                String fileName= UUID.randomUUID().toString().replaceAll("-","");
                //保存位置
                thread.setFilePath("G:/videodir/"+fileName+".flv");
                //直播地址

               // String hdUrl=GetTokenUtil
                thread.setStreamURL("直播地址的url");
                thread.start();
                //每三分钟保存一个视频
                t.sleep(3*60*1000);

                thread.stop();

            }catch(InterruptedException e){

                e.printStackTrace();

            }



        }

    }

你可能感兴趣的:(基于ffmpeg的直播引流视屏存储)