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

JAVA将直播流保存为本地视频文件

  • ffmpeg简介
  • 所需maven依赖(不同操作系统有所不同,注意看注释)
  • 代码实现

ffmpeg简介

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

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

<!--直播流转视频-->
<dependency><groupId>org.bytedeco</groupId><artifactId>javacv</artifactId><version>1.4.3</version>
</dependency>
<dependency><groupId>org.bytedeco.javacpp-presets</groupId><artifactId>ffmpeg-platform</artifactId><version>4.0.2-1.4.3</version>
</dependency>
<!--这个依赖Linux系统和windows系统有所不同-->
<!-- windows -->
<dependency><groupId>com.github.hoary.ffmpeg</groupId><artifactId>FFmpeg-windows-x86_64</artifactId><version>2.0.1.1</version>
</dependency>
<!-- Linux -->
<!--<dependency><groupId>com.github.hoary.ffmpeg</groupId><artifactId>FFmpeg-linux-x86_64</artifactId><version>2.0.1.1</version>
</dependency>-->

代码实现

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 {/*** 流地址 例如:rtmp://58.200.131.2:1935/livetv/hunantv 湖南卫视*/private String streamUrl = "https://flvopen.ys7.com:9188/openlive/0db58788a9df411cb0977f08c804b98a.hd.flv";/*** 停止录制时长 0为不限制时长*/private long timesSec = 0L;/*** 视频文件的输出路径*/private String outFilePath;/*** 录制的视频文件格式(文件后缀名)*/private String filenameExtension = "mp4";/*** 是否录制音频*/private boolean hasAudio = false;@Overridepublic 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();}
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部