You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Google Transcoder API转MP3遇容器格式不支持错误的求助

问题:Google Cloud Transcoder API转MP4到MP3失败,提示容器不支持

我需要用Google Cloud Transcoder API把Cloud Storage里的MP4文件转成MP3。官方文档显示该API支持MP3编解码器,但按以下配置提交后报错:

我的转码配置

const transcodeConfig = {
  elementaryStreams: [
    {
      key: 'audio-stream0',
      audioStream: {
        codec: 'mp3',
        bitrateBps: 64000,
      },
    },
  ],
  muxStreams: [
    {
      key: 'audio',
      container: 'mp3',
      elementaryStreams: ['audio-stream0'],
    },
  ],
};

API返回错误

INVALID_ARGUMENT: config.muxStreams[0].container is not supported, supported value from [ts fmp4 mp4 vtt]

请问如何实现MP3转码?该API是否真的支持MP3?完整代码如下:

import * as ff from '@google-cloud/functions-framework';
import { TranscoderServiceClient } from '@google-cloud/video-transcoder';

type Body = {
  id: string;
}

ff.http('TranscodeFunction', async (req: ff.Request, res: ff.Response) => {
  const body = req.body as Body;
  const transcoderServiceClient = new TranscoderServiceClient();

  const transcodeConfig = {
    elementaryStreams: [
      {
        key: 'audio-stream0',
        audioStream: {
          codec: 'mp3',
          bitrateBps: 64000,
        },
      },
    ],
    muxStreams: [
      {
        key: 'audio',
        container: 'mp3',
        elementaryStreams: ['audio-stream0'],
      },
    ],
  };

  const request = {
    parent: transcoderServiceClient.locationPath('***', 'asia-east1'), // Transcoder API未在asia-northeast提供
    job: {
      inputUri: `gs://foobarbucket/${body.id}/video.mp4`,
      outputUri: `gs://foobarbucket/${body.id}/`,
      config: transcodeConfig,
    },
  };
  const [operation] = await transcoderServiceClient.createJob(request);
  res.send(`Transcoding ${body.id} as [${operation.name}]...`);
});

解答

核心原因

Transcoder API支持MP3音频编解码,但不支持直接输出MP3容器格式。官方文档中提到的“支持MP3”指的是音频编解码器,而非文件容器。错误提示里的支持容器列表(ts、fmp4、mp4、vtt)是准确的。

实现MP3转码的两种方案

方案1:输出含MP3音频的MP4容器(推荐)

将容器改为mp4,输出仅包含MP3音频的MP4文件,多数播放器可直接识别,也可后续重命名为.mp3使用。

修改后的转码配置:

const transcodeConfig = {
  elementaryStreams: [
    {
      key: 'audio-stream0',
      audioStream: {
        codec: 'mp3',
        bitrateBps: 64000,
      },
    },
  ],
  muxStreams: [
    {
      key: 'audio',
      container: 'mp4', // 改用支持的mp4容器
      elementaryStreams: ['audio-stream0'],
    },
  ],
};

方案2:输出原始MP3音频流(raw容器)

若需要纯原始MP3数据,可使用raw容器(需确认API版本支持,部分旧版本可能未包含),输出后将文件后缀改为.mp3即可。

配置示例:

const transcodeConfig = {
  elementaryStreams: [
    {
      key: 'audio-stream0',
      audioStream: {
        codec: 'mp3',
        bitrateBps: 64000,
      },
    },
  ],
  muxStreams: [
    {
      key: 'audio',
      container: 'raw', // 输出原始音频流
      elementaryStreams: ['audio-stream0'],
    },
  ],
};

修改后的完整代码

import * as ff from '@google-cloud/functions-framework';
import { TranscoderServiceClient } from '@google-cloud/video-transcoder';

type Body = {
  id: string;
}

ff.http('TranscodeFunction', async (req: ff.Request, res: ff.Response) => {
  const body = req.body as Body;
  const transcoderServiceClient = new TranscoderServiceClient();

  const transcodeConfig = {
    elementaryStreams: [
      {
        key: 'audio-stream0',
        audioStream: {
          codec: 'mp3',
          bitrateBps: 64000,
        },
      },
    ],
    muxStreams: [
      {
        key: 'audio',
        container: 'mp4',
        elementaryStreams: ['audio-stream0'],
      },
    ],
  };

  const request = {
    parent: transcoderServiceClient.locationPath('***', 'asia-east1'),
    job: {
      inputUri: `gs://foobarbucket/${body.id}/video.mp4`,
      outputUri: `gs://foobarbucket/${body.id}/`,
      config: transcodeConfig,
    },
  };
  const [operation] = await transcoderServiceClient.createJob(request);
  res.send(`转码任务已启动,任务ID:[${operation.name}]...`);
});

内容的提问来源于stack exchange,提问作者Windymelt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 21:35:00