栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JAVA 直播链接保存为本地视频文件

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JAVA 直播链接保存为本地视频文件

JAVA将直播流保存为本地视频文件
  • ffmpeg简介
  • 所需maven依赖(不同操作系统有所不同,注意看注释)
  • 代码实现

ffmpeg简介

FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案 [1]

所需maven依赖(不同操作系统有所不同,注意看注释)


    org.bytedeco
    javacv
    1.4.3


    org.bytedeco.javacpp-presets
    ffmpeg-platform
    4.0.2-1.4.3




    com.github.hoary.ffmpeg
    FFmpeg-windows-x86_64
    2.0.1.1



代码实现
package cn.shencom.util;

import org.bytedeco.javacpp.avcodec;
import org.bytedeco.javacv.*;

import java.io.File;
import java.io.IOException;


public class RecordLiveVideoThread implements Runnable {
    
    private String streamUrl = "https://flvopen.ys7.com:9188/openlive/0db58788a9df411cb0977f08c804b98a.hd.flv";
    
    private long timesSec = 0L;
    
    private String outFilePath;
    
    private String filenameExtension = "mp4";
    
    private boolean hasAudio = false;
    
    @Override
    public void run() {
        if(outFilePath == null || outFilePath.length() == 0){
            System.out.println("文件输出路径不能为空。");
            return;
        }
        //根据直播链接实例FFmpeg抓帧器
        FFmpegframeGrabber grabber = new FFmpegframeGrabber(streamUrl);
        FFmpegframeRecorder recorder = null;
        try {
            grabber.start();
            frame frame = grabber.grabframe();
            if (frame != null) {
                //保存到本地的文件
                File outFile = new File(outFilePath);
                //文件不存在 || 文件不是一个普通文件
                if(!outFile.exists() || !outFile.isFile()){
                    if(!outFile.createNewFile()){
                        System.out.println("文件创建失败");
                        return;
                    }
                }
                // 视频输出地址,视频宽分辨率(宽,高),是否录制音频(0:不录制/1:录制)
                recorder = new FFmpegframeRecorder(outFilePath, frame.imageWidth, frame.imageHeight, hasAudio ? 1 : 0);
                //直播流格式
                recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
                //录制的视频格式
                recorder.setFormat(filenameExtension);
                //视频帧数
                recorder.setframeRate(60);
                //开始录制
                recorder.start();
                // 计算结束时间
                long endTime = System.currentTimeMillis() + timesSec * 1000;
                // 如果没有到录制结束时间并且获取到了下一帧则继续录制
                while ((System.currentTimeMillis() < endTime) && (frame != null)) {
                    //录制
                    recorder.record(frame);
                    //获取下一帧
                    frame = grabber.grabframe();
                }
                recorder.record(frame);
            }
            System.out.println("录制完成。");
        } catch (IOException e) {
            System.out.println("录制出错。");
            e.printStackTrace();
        } finally {
            //停止录制
            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) {
        RecordLiveVideoThread recordVideoThread = new RecordLiveVideoThread();
        recordVideoThread.outFilePath = "C:\test.mp4";
        //最好设置结束时长 如直接停止程序会造成输出文件的损坏无法正常播放
        recordVideoThread.timesSec = 15L;
        recordVideoThread.hasAudio = true;
        new Thread(recordVideoThread).start();
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/425404.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号