java下载直播视频

该代码示例展示了如何使用Java和javacv库从指定URL下载直播视频。它创建一个FFmpegFrameGrabber来获取视频流,然后用FFmpegFrameRecorder将视频帧记录到本地MP4文件。主要参数包括视频输出路径、录制时长和是否包含音频。
摘要由CSDN通过智能技术生成

java下载直播视频java下载直播视频java下载直播视频java下载直播视频java下载直播视频

package com.tlzn.tkwl.test.service;
import org.bytedeco.javacpp.avcodec;
import org.bytedeco.javacv.*;

import java.io.File;
import java.io.IOException;
/**
 * @ClassName testUrl
 * @Author dell-pc
 * @create 2023/3/9 16:28
 */
public class testUrl  implements Runnable {

    public static void main(String[] args) {
        testUrl testUrl = new testUrl();
        testUrl.outFilePath = "C:\\Users\\dell-pc\\Desktop\\aaaaaaaaaaaa\\test.mp4";
        //最好设置结束时长 如直接停止程序会造成输出文件的损坏无法正常播放
        testUrl.timesSec = 15L;
        testUrl.hasAudio = true;
        new Thread(testUrl).start();
    }


    /**
     * 流地址 例如:rtmp://58.200.131.2:1935/livetv/hunantv 湖南卫视
     */
    private String streamUrl = "https://alicam.tlzn-cq.com/tkwl/34020000002000000005.flv?auth_key=1678353261-0-0-576bcc235c635bd7cfc625f21b81e231";
    /**
     * 停止录制时长 0为不限制时长
     */
    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();
                }
            }
        }

    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值