欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-04-30 07:54:22
1、什么是ffmpeg?新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入转载一篇详细的介绍点我了解ffmpeg话不多说直接上代码package com.project.utils;import java.io.Fi...

这份代码主要是根据直播地址录像保存到指定的位置
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();

            }



        }

    }

本文地址:https://blog.csdn.net/qq_40852762/article/details/107357220