前言:最近项目需要把rtsp的视频流截取保存为MP4文件。经过多方调研,最终找到方案:调用ffmpeg命令行完成转码。ffmpeg命令行确实稳定靠谱!ok,下面就开始分享代码。
1、环境工具准备
ffmpeg的程序和一个稳定的rtsp流
这是我的ffmpeg的版本。
我这里rtsp流用的海康硬盘录里的,没有的同学可以网上找一些,有专门的网站提供一些免费的有一些流量的流,比如:
rtsp://rtspstream:e06d5bdf15e5f992e39ebb33506c805e@zephyr.rtsp.stream/movie
rtsp://rtspstream:742cb3f7bb397805f9e7829718fec9d8@zephyr.rtsp.stream/pattern
2、工具类代码,说几个重点也是我踩了很久才出来的坑:
1.ffmpegPath一定要写绝对路径的地址(如 D:\ffmpeg\ffmpeg.exe).
2.command在add的时候一定是一个字符一个位置不能直接拼成一句,也不要在单独拼接空格。否则直接会抛出无效的指令
3.获取的输入流必须单独建立一个线程来进行结果的打印,如果直接转字节打印,结束方法就会无效。
4.输出流在次和dos发送指令时一定要刷新。
核心处理类 RtspToMP4.java
import org.springframework.stereotype.Component;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* TODO:
*
* @Author: gaowh
* @create: 2024/4/24 10:11
*/
@Component
public class RtspToMP4 {
public class In implements Runnable{
private InputStream inputStream;
public In(InputStream inputStream) {
this.inputStream = inputStream;
}
@Override
public void run() {
try {
//转成字符输入流
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "gbk");
int len = -1;
char[] c = new char[1024];