网站通话使用webrtc,新增ffmpeg
This commit is contained in:
@@ -103,37 +103,56 @@ func (t *FFmpegTranscoder) Start() error {
|
||||
|
||||
if t.config.CopyMode {
|
||||
// H.264 copy 模式:只重封装,不重新编码(低延迟)
|
||||
// ffmpeg -f webm -i pipe:0 -c:v copy -c:a aac -f flv pipe:1
|
||||
// 添加低延迟参数:禁用缓冲、减少探测时间
|
||||
args = []string{
|
||||
"-f", "webm", // 输入格式
|
||||
"-i", "pipe:0", // 从 stdin 读取
|
||||
"-c:v", "copy", // 视频直接复制,不重新编码
|
||||
// 低延迟输入参数
|
||||
"-fflags", "nobuffer", // 禁用输入缓冲
|
||||
"-flags", "low_delay", // 低延迟模式
|
||||
"-probesize", "32", // 减少探测大小(字节)
|
||||
"-analyzeduration", "0", // 禁用分析时长
|
||||
"-f", "webm", // 输入格式
|
||||
"-i", "pipe:0", // 从 stdin 读取
|
||||
// 输出参数
|
||||
"-c:v", "copy", // 视频直接复制,不重新编码
|
||||
"-c:a", t.config.AudioCodec,
|
||||
"-b:a", t.config.AudioBitrate,
|
||||
"-ar", fmt.Sprintf("%d", t.config.AudioSampleRate),
|
||||
"-ac", fmt.Sprintf("%d", t.config.AudioChannels),
|
||||
"-f", "flv", // 输出格式
|
||||
"pipe:1", // 输出到 stdout
|
||||
// 低延迟输出参数
|
||||
"-fflags", "+genpts", // 生成时间戳
|
||||
"-f", "flv", // 输出格式
|
||||
"pipe:1", // 输出到 stdout
|
||||
}
|
||||
log.Printf("🎬 [FFmpegTranscoder] 使用 copy 模式(H.264 重封装)")
|
||||
log.Printf("🎬 [FFmpegTranscoder] 使用 copy 模式(H.264 重封装,低延迟)")
|
||||
} else {
|
||||
// VP8/VP9 转码模式:重新编码为 H.264
|
||||
// ffmpeg -f webm -i pipe:0 -c:v libx264 -preset ultrafast -tune zerolatency -c:a aac -f flv pipe:1
|
||||
// 添加低延迟参数
|
||||
args = []string{
|
||||
"-f", "webm", // 输入格式
|
||||
"-i", "pipe:0", // 从 stdin 读取
|
||||
// 低延迟输入参数
|
||||
"-fflags", "nobuffer", // 禁用输入缓冲
|
||||
"-flags", "low_delay", // 低延迟模式
|
||||
"-probesize", "32", // 减少探测大小(字节)
|
||||
"-analyzeduration", "0", // 禁用分析时长
|
||||
"-f", "webm", // 输入格式
|
||||
"-i", "pipe:0", // 从 stdin 读取
|
||||
// 视频编码参数
|
||||
"-c:v", t.config.VideoCodec,
|
||||
"-preset", t.config.VideoPreset,
|
||||
"-tune", "zerolatency", // 零延迟模式
|
||||
"-tune", "zerolatency", // 零延迟调优
|
||||
"-b:v", t.config.VideoBitrate,
|
||||
"-g", "30", // GOP 大小(减少关键帧间隔)
|
||||
"-keyint_min", "15", // 最小关键帧间隔
|
||||
// 音频编码参数
|
||||
"-c:a", t.config.AudioCodec,
|
||||
"-b:a", t.config.AudioBitrate,
|
||||
"-ar", fmt.Sprintf("%d", t.config.AudioSampleRate),
|
||||
"-ac", fmt.Sprintf("%d", t.config.AudioChannels),
|
||||
"-f", "flv", // 输出格式
|
||||
"pipe:1", // 输出到 stdout
|
||||
// 低延迟输出参数
|
||||
"-fflags", "+genpts", // 生成时间戳
|
||||
"-f", "flv", // 输出格式
|
||||
"pipe:1", // 输出到 stdout
|
||||
}
|
||||
log.Printf("🎬 [FFmpegTranscoder] 使用转码模式(VP8/VP9 → H.264)")
|
||||
log.Printf("🎬 [FFmpegTranscoder] 使用转码模式(VP8/VP9 → H.264,低延迟)")
|
||||
}
|
||||
|
||||
t.cmd = exec.Command(t.ffmpegPath, args...)
|
||||
|
||||
Reference in New Issue
Block a user