- ffmpeg简介
- 所需maven依赖(不同操作系统有所不同,注意看注释)
- 代码实现
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();
}
}



