Audio-Visual Flamingo 对输入视频和音频的格式要求

文章导读
Audio-Visual Flamingo 这类视频-音频联合模型,输入并不是直接把一个 mp4 文件喂给模型完事。通常要先把视频拆成画面帧序列,把音频抽取成波形,再分别送入各自的编码器。格式要求因此分两层:你给模型包装函数的是一种形态,模型真正消费的又是另一种形态。先想清楚这一点,才能判断报错是来自解码层还是张量层。
📋 目录
  1. 一 先区分输入路径型还是张量型
  2. 二 视频侧常见格式约束
  3. 三 音频侧常见格式约束
  4. 四 可试的预处理骨架
  5. 五 验证清单
A A

Audio-Visual Flamingo 这类视频-音频联合模型,输入并不是直接把一个 mp4 文件喂给模型完事。通常要先把视频拆成画面帧序列,把音频抽取成波形,再分别送入各自的编码器。格式要求因此分两层:你给模型包装函数的是一种形态,模型真正消费的又是另一种形态。先想清楚这一点,才能判断报错是来自解码层还是张量层。

先确认模型接口接受的是“原始视频路径”还是“已抽取的特征张量”。如果接受原始文件,优先提供 mp4/H.264 容器,音频用 AAC,帧率固定,音频重采样到 16kHz 左右;如果接受张量,则按模型要求的形状提供连续帧和对应波形。两者都建议准备一个最小样例,用 ffprobe 核对文件流,再用一个已知视频跑通前向,再逐步调整。

先区分输入路径型还是张量型

看调用示例或函数签名:如果模型接收 video_path、audio_path 这样的字符串参数,那就是路径型,模型内部会自己解码;如果接收的是 numpy 数组或 torch.Tensor,那就是张量型。路径型对容器编码更敏感,张量型对归一化和形状更敏感。常见开源实现里,两种都可能存在,同一个仓库不同分支也可能不一样,所以不要只看模型名。

视频侧常见格式约束

  • 容器:建议 mp4、mov,兼容性最好;avi 要检查内部编码,避免 mjpeg 等少见编码。
  • 视频编码:优先 H.264(avc1)或 H.265(hevc),模型内置解码器通常兼容;VP9、AV1 不一定优先支持。
  • 帧率:固定帧率是前提,可变帧率(VFR)必须先转成 CFR。建议按模型窗口选择 8、16 或 24 fps,帧数控制在几秒到几十秒不等。
  • 分辨率:不强制匹配原始训练尺寸,但建议先把最长边缩放到 224 或 336 附近,同时保持宽高比。变形拉伸会让画面失真,影响后续编码效果。
  • 时长:过长的视频会占大量显存和内存,建议先截取关键片段再预测。

验证方式:用 ffmpeg 转码时加上固定帧率和尺寸参数,例如 ffmpeg -i input.mp4 -vf 'fps=8' -ac 1 -ar 16000 prep.mp4。转换后对比原文件,确认画面内容没被抽得太稀疏。

音频侧常见格式约束

  • 音轨建议与视频封装在同一文件,也可以用单独 wav 传入,具体取决于接口。
  • 采样率:模型的音频编码器常见输入是 16kHz,建议在预处理阶段用 librosa 或 ffmpeg 重采样到 16kHz 单声道。
  • 声道:单声道最稳妥;双声道通常也能用,但同一时间两路不一致容易让同步判断变复杂。
  • 时长对齐:音频不能显著短于视频,否则尾部没有对应信息;也不能把多段音频拼接进来。
  • 编码:AAC、PCM 都比较稳,避免使用需要额外解码授权的压损格式。

可试的预处理骨架

下面这段代码用 OpenCV 抽帧、librosa 读音频,可用于准备张量型输入。它只是通用骨架,具体张量形状和归一化必须对照你拿到的模型源代码调整。

Audio-Visual Flamingo 对输入视频和音频的格式要求
import cv2
import librosa
import numpy as np

video_path = 'demo.mp4'
target_fps = 8
target_sr = 16000

cap = cv2.VideoCapture(video_path)
fps = cap.get(cv2.CAP_PROP_FPS)
frame_id = 0
frames = []
while True:
    ret, frame = cap.read()
    if not ret:
        break
    if frame_id % round(fps / target_fps) == 0:
        frames.append(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
    frame_id += 1
cap.release()

waveform, _ = librosa.load(video_path, sr=target_sr, mono=True)
# 后续把 frames 堆叠成 (T, H, W, C),再转成模型要求的 torch.Tensor

这个骨架假设视频文件在同一路径下同时含视频和音轨。如果模型要求单独音频路径,可以把 waveform 存成单通道 wav,再把路径传给接口。

验证清单

  1. 用 ffprobe -v error -show_streams input.mp4 查看是否存在 video 和 audio 两个流。
  2. 确认视频流的 codec_name、width、height、avg_frame_rate 是否正常,避免 0 帧率。
  3. 确认音频流的 sample_rate 不为 0,channels 不为 0,时长与视频接近。
  4. 先拿一个 3 秒短视频测试完整前向,能跑通再逐步加长。
  5. 报错时看关键字:如果出现在读取阶段,多半是容器或编码问题;如果出现在模型 forward,多半是张量维度和数值范围问题。

最后,不同发布版和不同运行环境对格式的容忍度不同。本地跑通不一定代表部署环境能解码同样文件,所以部署前要把“输入预处理”当作独立模块固定下来,而不是依赖用户上传原始文件碰运气。