修复视频分辨率问题
This commit is contained in:
@@ -1893,7 +1893,7 @@ func (s *V1Service) generateCustomVideo(ctx context.Context, eventID string, mod
|
|||||||
if len(active) == 0 {
|
if len(active) == 0 {
|
||||||
return nil, "", ErrNoProviderAccount
|
return nil, "", ErrNoProviderAccount
|
||||||
}
|
}
|
||||||
size := upstreamSize(aspectRatio, resolution)
|
size := upstreamVideoSize(aspectRatio, resolution)
|
||||||
var lastErr error
|
var lastErr error
|
||||||
var videoURL string
|
var videoURL string
|
||||||
busy := 0
|
busy := 0
|
||||||
@@ -1974,6 +1974,38 @@ func upstreamSize(aspectRatio, resolution string) string {
|
|||||||
return fmt.Sprintf("%dx%d", base*w/h, base)
|
return fmt.Sprintf("%dx%d", base*w/h, base)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// upstreamVideoSize maps our (ratio, resolution) to a "WxH" size for video
|
||||||
|
// upstreams. Video "Np" tiers set the SHORT edge in pixels (like grok:
|
||||||
|
// 720p 1:1 → 720x720, 720p 16:9 → 1280x720); 2K/4K fall back to the
|
||||||
|
// long-edge mapping shared with images.
|
||||||
|
func upstreamVideoSize(aspectRatio, resolution string) string {
|
||||||
|
short := 0
|
||||||
|
switch res := strings.ToLower(strings.TrimSpace(resolution)); res {
|
||||||
|
case "540p":
|
||||||
|
short = 540
|
||||||
|
case "720p", "":
|
||||||
|
short = 720
|
||||||
|
case "1080p":
|
||||||
|
short = 1080
|
||||||
|
}
|
||||||
|
if short == 0 {
|
||||||
|
return upstreamSize(aspectRatio, resolution)
|
||||||
|
}
|
||||||
|
w, h := 1, 1
|
||||||
|
parts := strings.Split(strings.ReplaceAll(strings.TrimSpace(aspectRatio), "x", ":"), ":")
|
||||||
|
if len(parts) == 2 {
|
||||||
|
if a, e1 := strconv.Atoi(strings.TrimSpace(parts[0])); e1 == nil && a > 0 {
|
||||||
|
if b, e2 := strconv.Atoi(strings.TrimSpace(parts[1])); e2 == nil && b > 0 {
|
||||||
|
w, h = a, b
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if w >= h {
|
||||||
|
return fmt.Sprintf("%dx%d", short*w/h, short)
|
||||||
|
}
|
||||||
|
return fmt.Sprintf("%dx%d", short, short*h/w)
|
||||||
|
}
|
||||||
|
|
||||||
// upstreamQuality maps a resolution tier to the OpenAI quality enum.
|
// upstreamQuality maps a resolution tier to the OpenAI quality enum.
|
||||||
func upstreamQuality(resolution string) string {
|
func upstreamQuality(resolution string) string {
|
||||||
switch strings.ToUpper(strings.TrimSpace(resolution)) {
|
switch strings.ToUpper(strings.TrimSpace(resolution)) {
|
||||||
|
|||||||
@@ -303,7 +303,13 @@ async function copyImage(url) {
|
|||||||
const count = ref(1)
|
const count = ref(1)
|
||||||
const batchCount = computed(() => (mode.value === 'image' ? Math.max(1, Math.min(4, count.value)) : 1))
|
const batchCount = computed(() => (mode.value === 'image' ? Math.max(1, Math.min(4, count.value)) : 1))
|
||||||
|
|
||||||
|
// Guard against accidental double-clicks: a second run() within 600ms is
|
||||||
|
// ignored (each click otherwise fires an independent, charged generation).
|
||||||
|
let lastRunAt = 0
|
||||||
async function run() {
|
async function run() {
|
||||||
|
const now = Date.now()
|
||||||
|
if (now - lastRunAt < 600) return
|
||||||
|
lastRunAt = now
|
||||||
if (!modelId.value) { error.value = '请选择模型'; return }
|
if (!modelId.value) { error.value = '请选择模型'; return }
|
||||||
if (!prompt.value.trim()) { error.value = '请输入提示词'; return }
|
if (!prompt.value.trim()) { error.value = '请输入提示词'; return }
|
||||||
if (refsRequired.value && refImages.value.length < 1) {
|
if (refsRequired.value && refImages.value.length < 1) {
|
||||||
|
|||||||
Reference in New Issue
Block a user