使用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
相关产品推荐
相关产品推荐

