视频录制
下面的案例是录制MP4的,inputFile是直播的地址,outputFile是保存的地址
public static void frameRecord(String inputFile, String outputFile)
{
int width=1920;
int height=1080;
// 获取视频源
log.info("地址:"+inputFile);
FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(inputFile);
// 如果不设置成tcp连接时,默认使用UDP,丢包现象比较严重
grabber.setOption("rtmp_transport", "tcp"); // 设置成tcp以后比较稳定
grabber.setImageWidth(width);
grabber.setImageHeight(height);
grabber.setOption("rtmp_buffer", "1000");
// 流媒体输出地址,分辨率(长,高),是否录制音频(0:单声道/1:多声道)
//FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(outputFile, width, //height,0);
//当然,也可以不加
FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(outputFile, width, height);
recorder.setInterleaved(true);
recorder.setVideoOption("crf","18"); //压缩画质 降低大小 18 为百分之21 51压缩为百分之97
recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);//设置视频解码器
recorder.setFormat("mp4");
// recorder.setFormat("flv"); // rtmp的类型
// recorder.setAudioCodec(grabber.getAudioCodec());
recorder.setFrameRate(25);//25帧
recorder.setImageWidth(width);
recorder.setImageHeight(height);
log.info("开始录制视频");
// 开始取视频源
recordByFrame(grabber, recorder);
}
private static void recordByFrame(FFmpegFrameGrabber grabber, FFmpegFrameRecorder recorder)
{
//记得用Thread ,不然会出现其他接口用不了情况
new Thread(()->{
try {
grabber.start();
recorder.start();
//用于记录重新连接次数
int count = 0;
while(true){
count++;
Frame frame;
frame=grabber.grabImage();
if(frame == null){
log.info("获取不到 连接");
if(count % 100 == 0){
log.error("重连次数="+count);
if(count % 1000 == 0){
log.info("退出循环");
break;
}}
continue;
}
count=0;
recorder.record(frame);
}
grabber.stop();
grabber.release();
recorder.stop();
recorder.release();
log.info("结束录制");
}catch (Exception e){
log.error(e.getMessage());
}
}).start();
}
标题
user root;
worker_processes 1;
error_log logs/error.log debug;
events {
worker_connections 1024;
}
rtmp {
server {
listen 1935;
application myapp {
//开启直播
live on;
//开启hls
hls on;
//hls保存地址
hls_path /xxx/;
//每个断片时长
hls_fragment 5s;
//可播放长度
hls_playlist_length 30s;
//全部人都可以推送视频到服务器
allow play all;
}
}
}
http {
server {
listen 8081;
location /stat {
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
}
各协议优缺点: