[*] 默认值调整

This commit is contained in:
acgist
2023-06-08 15:45:33 +08:00
parent cbd5661c56
commit 87256bcfbd
8 changed files with 58 additions and 73 deletions

View File

@@ -30,6 +30,7 @@
## 计划任务 ## 计划任务
* E2E
* 发布版本1.0.0 * 发布版本1.0.0
* 开机自启 * 开机自启
* 录像底噪 * 录像底噪
@@ -38,11 +39,12 @@
* 分辨率调整 * 分辨率调整
* 服务端录像 * 服务端录像
* 安卓预览按钮 * 安卓预览按钮
*内存抖动 *内存抖动
* 降低视频录像大小 * 降低视频录像大小
* 防止重复邀请拉取 * 防止重复邀请拉取
* 码率等等参数配置验证 * 码率等等参数配置验证
* 查询消费者生产者信息 * 查询消费者生产者信息
* 存在TURN服务优先使用
* 浏览器WebRTC监控页面关闭`chrome://webrtc-internals/` * 浏览器WebRTC监控页面关闭`chrome://webrtc-internals/`
## 完成任务 ## 完成任务

View File

@@ -908,7 +908,7 @@ class Taoyao {
console.warn("请求录像关键帧视频关闭", filepath); console.warn("请求录像关键帧视频关闭", filepath);
return; return;
} }
// 文件开始录像同时已经开始生产数据 // 判断文件大小验证是否已经开始录制:创建文件 -> 视频信息 -> 视频数据 -> 封装视频
if(fs.existsSync(filepath) && fs.statSync(filepath).size >= 128 * 1024) { if(fs.existsSync(filepath) && fs.statSync(filepath).size >= 128 * 1024) {
console.debug("请求录像关键帧已经开始录像", filepath); console.debug("请求录像关键帧已经开始录像", filepath);
return; return;

View File

@@ -17,29 +17,31 @@ import lombok.Setter;
@ConfigurationProperties(prefix = "taoyao.ffmpeg") @ConfigurationProperties(prefix = "taoyao.ffmpeg")
public class FfmpegProperties { public class FfmpegProperties {
@Schema(title = "SDP模板", description = "SDP模板") @Schema(title = "录像地址", description = "录像地址")
private String sdp; private String host;
@Schema(title = "媒体录像", description = "媒体录像") @Schema(title = "最小端口", description = "最小端口")
private Integer minPort;
@Schema(title = "最大端口", description = "最大端口")
private Integer maxPort;
@Schema(title = "录像帧率", description = "录像帧率")
private Integer frameRate;
@Schema(title = "录像命令", description = "录像命令")
private String record; private String record;
@Schema(title = "预览截图", description = "预览截图") @Schema(title = "预览命令", description = "预览命令")
private String preview; private String preview;
@Schema(title = "视频时长", description = "视频时长") @Schema(title = "时长命令", description = "时长命令")
private String duration; private String duration;
@Schema(title = "录像SDP", description = "录像SDP")
private String recordSdp;
@Schema(title = "预览时间", description = "预览时间")
private Integer previewTime;
@Schema(title = "时长提取", description = "时长提取")
private String durationRegex;
@Schema(title = "存储目录", description = "存储目录") @Schema(title = "存储目录", description = "存储目录")
private String storagePath; private String storagePath;
@Schema(title = "图片存储目录", description = "图片存储目录") @Schema(title = "图片存储目录", description = "图片存储目录")
private String storageImagePath; private String storageImagePath;
@Schema(title = "视频存储目录", description = "视频存储目录") @Schema(title = "视频存储目录", description = "视频存储目录")
private String storageVideoPath; private String storageVideoPath;
@Schema(title = "预览截图时间", description = "预览截图时间")
private Integer previewTime;
@Schema(title = "预览截图时间", description = "预览截图时间")
private String durationRegex;
@Schema(title = "录像录像地址", description = "录像录像地址")
private String host;
@Schema(title = "录像最小端口", description = "录像最小端口")
private Integer minPort;
@Schema(title = "录像最大端口", description = "录像最大端口")
private Integer maxPort;
} }

View File

@@ -7,8 +7,6 @@ server:
key-store-password: 123456 key-store-password: 123456
key-password: 123456 key-password: 123456
taoyao: taoyao:
ffmpeg:
host: 192.168.8.93
security: security:
permit: permit:
- / - /

View File

@@ -71,9 +71,9 @@ taoyao:
min-video-bitrate: 800 min-video-bitrate: 800
max-video-bitrate: 1600 max-video-bitrate: 1600
# 音频配置 # 音频配置
# 采样位数 # 采样位数(位深)
min-sample-size: 8 min-sample-size: 16
max-sample-size: 32 max-sample-size: 16
# 采样率 # 采样率
min-sample-rate: 8000 min-sample-rate: 8000
max-sample-rate: 48000 max-sample-rate: 48000
@@ -85,8 +85,8 @@ taoyao:
audio: audio:
format: OPUS format: OPUS
bitrate: 96 bitrate: 96
sample-size: 32 sample-size: 16
sample-rate: 44100 sample-rate: 48000
# 默认视频 # 默认视频
video: video:
format: H264 format: H264
@@ -99,26 +99,26 @@ taoyao:
fd-audio: fd-audio:
format: OPUS format: OPUS
bitrate: 256 bitrate: 256
sample-size: 32 sample-size: 16
sample-rate: 48000 sample-rate: 48000
# 高清 # 高清
hd-audio: hd-audio:
format: OPUS format: OPUS
bitrate: 128 bitrate: 128
sample-size: 24 sample-size: 16
sample-rate: 32000 sample-rate: 32000
# 标清 # 标清
sd-audio: sd-audio:
format: OPUS format: OPUS
bitrate: 96 bitrate: 96
sample-size: 24 sample-size: 16
sample-rate: 16000 sample-rate: 16000
# 视频质量 # 视频质量
videos: videos:
# 4KUD=UHD=4K # 4KUD=UHD=4K
ud-video: ud-video:
format: H264 format: H264
bitrate: 1600 bitrate: 1800
frame-rate: 45 frame-rate: 45
resolution: 4096*2160 resolution: 4096*2160
# 2KQD=QHD=2K # 2KQD=QHD=2K
@@ -147,8 +147,22 @@ taoyao:
resolution: 720*480 resolution: 720*480
# FFmpeg配置 # FFmpeg配置
ffmpeg: ffmpeg:
# 录像地址
host: 127.0.0.1
# 最小端口
min-port: 50000
# 最大端口
max-port: 59999
# 录像帧率
frame-rate: ${taoyao.media.video.frame-rate:24}
# 录像命令
record: ffmpeg -y -protocol_whitelist "file,rtp,udp" -thread_queue_size 1024 -c:a libopus -c:v libvpx -r:v %d -i %s -c:a aac -c:v h264 %s
# 预览命令
preview: ffmpeg -y -i %s -ss %d -vframes 1 -f image2 %s
# 时长命令
duration: ffprobe -i %s -show_entries format=duration
# 录像SDPVP8 | H264 # 录像SDPVP8 | H264
sdp: | record-sdp: |
v=0 v=0
o=- 0 0 IN IP4 127.0.0.1 o=- 0 0 IN IP4 127.0.0.1
s=TaoyaoRecord s=TaoyaoRecord
@@ -163,27 +177,16 @@ taoyao:
a=rtcp:%d a=rtcp:%d
a=rtpmap:101 VP8/90000 a=rtpmap:101 VP8/90000
a=recvonly a=recvonly
# 录像命令 # 预览时间
record: ffmpeg -y -protocol_whitelist "file,rtp,udp" -thread_queue_size 1024 -c:a libopus -c:v libvpx -r:v %d -i %s -c:a aac -c:v h264 %s preview-time: 4
# 预览命令 # 时长提取
preview: ffmpeg -y -i %s -ss %d -vframes 1 -f image2 %s duration-regex: .*duration\=([0-9\.]+).*
# 时长命令
duration: ffprobe -i %s -show_entries format=duration
# 存储目录 # 存储目录
storage-path: /data/taoyao/storage storage-path: /data/taoyao/storage
# 图片存储目录 # 图片存储目录
storage-image-path: /data/taoyao/storage/image storage-image-path: /data/taoyao/storage/image
# 视频存储目录 # 视频存储目录
storage-video-path: /data/taoyao/storage/video storage-video-path: /data/taoyao/storage/video
# 预览时间
preview-time: 4
# 时长提取
duration-regex: .*duration\=([0-9\.]+).*
# 录像地址
host: 127.0.0.1
# 端口范围
min-port: 50000
max-port: 59999
# Socket信令 # Socket信令
socket: socket:
enabled: true enabled: true

View File

@@ -3,8 +3,6 @@ package com.acgist.taoyao;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import com.acgist.taoyao.boot.config.FfmpegProperties; import com.acgist.taoyao.boot.config.FfmpegProperties;
import com.acgist.taoyao.boot.config.MediaProperties;
import com.acgist.taoyao.boot.config.MediaVideoProperties;
import com.acgist.taoyao.signal.party.media.Recorder; import com.acgist.taoyao.signal.party.media.Recorder;
public class RecorderTest { public class RecorderTest {
@@ -12,11 +10,10 @@ public class RecorderTest {
@Test @Test
public void testStart() throws InterruptedException { public void testStart() throws InterruptedException {
final FfmpegProperties ffmpegProperties = new FfmpegProperties(); final FfmpegProperties ffmpegProperties = new FfmpegProperties();
ffmpegProperties.setStorageVideoPath("D:\\tmp\\video"); ffmpegProperties.setHost("127.0.0.1");
ffmpegProperties.setMinPort(50000); ffmpegProperties.setMinPort(50000);
ffmpegProperties.setMaxPort(59999); ffmpegProperties.setMaxPort(59999);
ffmpegProperties.setHost("127.0.0.1"); ffmpegProperties.setRecordSdp("""
ffmpegProperties.setSdp("""
v=0 v=0
o=- 0 0 IN IP4 127.0.0.1 o=- 0 0 IN IP4 127.0.0.1
s=TaoyaoRecord s=TaoyaoRecord
@@ -36,11 +33,8 @@ public class RecorderTest {
ffmpegProperties.setRecord("ffmpeg -y -protocol_whitelist \"file,rtp,udp\" -thread_queue_size 1024 -c:a libopus -c:v libvpx -r:v %d -i %s -c:a aac -c:v h264 %s"); ffmpegProperties.setRecord("ffmpeg -y -protocol_whitelist \"file,rtp,udp\" -thread_queue_size 1024 -c:a libopus -c:v libvpx -r:v %d -i %s -c:a aac -c:v h264 %s");
ffmpegProperties.setPreview("ffmpeg -y -i %s -ss %d -vframes 1 -f image2 %s"); ffmpegProperties.setPreview("ffmpeg -y -i %s -ss %d -vframes 1 -f image2 %s");
ffmpegProperties.setDuration("ffprobe -i %s -show_entries format=duration"); ffmpegProperties.setDuration("ffprobe -i %s -show_entries format=duration");
final MediaProperties mediaProperties = new MediaProperties(); ffmpegProperties.setStorageVideoPath("D:\\tmp\\video");
final MediaVideoProperties mediaVideoProperties = new MediaVideoProperties(); final Recorder recorder = new Recorder("taoyao", null, null, ffmpegProperties);
mediaVideoProperties.setFrameRate(24);
mediaProperties.setVideo(mediaVideoProperties);
final Recorder recorder = new Recorder("taoyao", null, null, mediaProperties, ffmpegProperties);
recorder.start(); recorder.start();
Thread.sleep(20 * 1000); Thread.sleep(20 * 1000);
recorder.stop(); recorder.stop();

View File

@@ -11,8 +11,6 @@ import java.util.regex.Pattern;
import org.apache.commons.lang3.math.NumberUtils; import org.apache.commons.lang3.math.NumberUtils;
import com.acgist.taoyao.boot.config.FfmpegProperties; import com.acgist.taoyao.boot.config.FfmpegProperties;
import com.acgist.taoyao.boot.config.MediaProperties;
import com.acgist.taoyao.boot.config.MediaVideoProperties;
import com.acgist.taoyao.boot.utils.FileUtils; import com.acgist.taoyao.boot.utils.FileUtils;
import com.acgist.taoyao.boot.utils.NetUtils; import com.acgist.taoyao.boot.utils.NetUtils;
import com.acgist.taoyao.boot.utils.ScriptUtils; import com.acgist.taoyao.boot.utils.ScriptUtils;
@@ -130,10 +128,6 @@ public class Recorder {
* 文件路径 * 文件路径
*/ */
private final String filepath; private final String filepath;
/**
* 媒体配置
*/
private final MediaProperties mediaProperties;
/** /**
* FFmpeg配置 * FFmpeg配置
*/ */
@@ -146,10 +140,7 @@ public class Recorder {
* @param mediaProperties 媒体配置 * @param mediaProperties 媒体配置
* @param ffmpegProperties FFmpeg配置 * @param ffmpegProperties FFmpeg配置
*/ */
public Recorder( public Recorder(String name, Room room, ClientWrapper clientWrapper, FfmpegProperties ffmpegProperties) {
String name, Room room, ClientWrapper clientWrapper,
MediaProperties mediaProperties, FfmpegProperties ffmpegProperties
) {
this.close = false; this.close = false;
this.running = false; this.running = false;
this.room = room; this.room = room;
@@ -158,7 +149,6 @@ public class Recorder {
this.preview = Paths.get(this.folder, "taoyao.jpg").toAbsolutePath().toString(); this.preview = Paths.get(this.folder, "taoyao.jpg").toAbsolutePath().toString();
this.filepath = Paths.get(this.folder, "taoyao.mp4").toAbsolutePath().toString(); this.filepath = Paths.get(this.folder, "taoyao.mp4").toAbsolutePath().toString();
this.clientWrapper = clientWrapper; this.clientWrapper = clientWrapper;
this.mediaProperties = mediaProperties;
this.ffmpegProperties = ffmpegProperties; this.ffmpegProperties = ffmpegProperties;
FileUtils.mkdirs(this.folder); FileUtils.mkdirs(this.folder);
} }
@@ -185,10 +175,9 @@ public class Recorder {
* 录制视频 * 录制视频
*/ */
private void record() { private void record() {
final MediaVideoProperties mediaVideoProperties = this.mediaProperties.getVideo();
final String recordScript = String.format( final String recordScript = String.format(
this.ffmpegProperties.getRecord(), this.ffmpegProperties.getRecord(),
mediaVideoProperties.getFrameRate(), this.ffmpegProperties.getFrameRate(),
this.sdpfile, this.sdpfile,
this.filepath this.filepath
); );
@@ -219,7 +208,7 @@ public class Recorder {
this.videoPort = NetUtils.scanPort(this.audioPort + 2, maxPort); this.videoPort = NetUtils.scanPort(this.audioPort + 2, maxPort);
this.videoRtcpPort = NetUtils.scanPort(this.audioPort + 3, maxPort); this.videoRtcpPort = NetUtils.scanPort(this.audioPort + 3, maxPort);
final String sdp = String.format( final String sdp = String.format(
this.ffmpegProperties.getSdp(), this.ffmpegProperties.getRecordSdp(),
this.audioPort, this.audioPort,
this.audioRtcpPort, this.audioRtcpPort,
this.videoPort, this.videoPort,

View File

@@ -10,7 +10,6 @@ import com.acgist.taoyao.boot.annotation.Description;
import com.acgist.taoyao.boot.annotation.Protocol; import com.acgist.taoyao.boot.annotation.Protocol;
import com.acgist.taoyao.boot.config.Constant; import com.acgist.taoyao.boot.config.Constant;
import com.acgist.taoyao.boot.config.FfmpegProperties; import com.acgist.taoyao.boot.config.FfmpegProperties;
import com.acgist.taoyao.boot.config.MediaProperties;
import com.acgist.taoyao.boot.model.Message; import com.acgist.taoyao.boot.model.Message;
import com.acgist.taoyao.boot.utils.MapUtils; import com.acgist.taoyao.boot.utils.MapUtils;
import com.acgist.taoyao.signal.client.Client; import com.acgist.taoyao.signal.client.Client;
@@ -51,12 +50,10 @@ public class ControlServerRecordProtocol extends ProtocolControlAdapter implemen
public static final String SIGNAL = "control::server::record"; public static final String SIGNAL = "control::server::record";
private final MediaProperties mediaProperties;
private final FfmpegProperties ffmpegProperties; private final FfmpegProperties ffmpegProperties;
public ControlServerRecordProtocol(MediaProperties mediaProperties, FfmpegProperties ffmpegProperties) { public ControlServerRecordProtocol(FfmpegProperties ffmpegProperties) {
super("服务端录像信令", SIGNAL); super("服务端录像信令", SIGNAL);
this.mediaProperties = mediaProperties;
this.ffmpegProperties = ffmpegProperties; this.ffmpegProperties = ffmpegProperties;
} }
@@ -122,7 +119,7 @@ public class ControlServerRecordProtocol extends ProtocolControlAdapter implemen
} }
final String name = UUID.randomUUID().toString(); final String name = UUID.randomUUID().toString();
// 打开录制线程 // 打开录制线程
final Recorder recorder = new Recorder(name, room, clientWrapper, this.mediaProperties, this.ffmpegProperties); final Recorder recorder = new Recorder(name, room, clientWrapper, this.ffmpegProperties);
recorder.start(); recorder.start();
clientWrapper.setRecorder(recorder); clientWrapper.setRecorder(recorder);
// 打开媒体录制 // 打开媒体录制