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

如何在Google Apps Script内生成带音频的Google Slides转MP4?求更快方案

解决Google Slides转MP4加音频的速度问题:替代方案与优化思路

我明白你当前的痛点——用GAS拉取幻灯片缩略图再传到VM转码,不仅慢还容易超时。其实GAS本身没有原生的视频生成能力,但我们可以通过利用Google云生态的原生服务或者优化现有流程来大幅提升效率,甚至比你看到的Marketplace插件更快。

一、最优方案:用Google Cloud Transcoder API替代VM转码

Marketplace插件之所以快,大概率是调用了Google的云原生转码服务,而非自己维护VM。你可以直接复用这套能力,步骤如下:

核心逻辑

把幻灯片导出为PDF、音频传到Cloud Storage,然后用Transcoder API直接合成MP4——全程在Google云内部流转,没有跨网络的大文件传输,转码效率拉满。

具体实现步骤(GAS代码示例)

  1. 启用必要的高级服务:在GAS编辑器的「资源」→「高级Google服务」里,开启Drive API、Cloud Storage和Cloud Transcoder API,同时在Google Cloud控制台启用对应API并配置权限。

  2. 导出Slides为PDF到Drive

function exportSlidesToPDF(slideId) {
  const pdfFile = Drive.Files.export(slideId, 'application/pdf', {
    supportsAllDrives: true
  });
  return pdfFile.id;
}
  1. 将PDF和音频上传到Cloud Storage
function uploadToGCS(fileId, bucketName, destFileName) {
  const file = DriveApp.getFileById(fileId);
  const blob = file.getBlob();
  const storage = CloudStorageApp.getStorage();
  storage.getBucket(bucketName).createBlob(destFileName).setBlob(blob);
  return `gs://${bucketName}/${destFileName}`;
}
  1. 调用Transcoder API创建转码任务
function createTranscodeJob(pdfGcsUri, audioGcsUri, outputGcsUri, projectId, location) {
  const jobConfig = {
    inputUri: pdfGcsUri,
    outputUri: outputGcsUri,
    config: {
      elementaryStreams: [
        {
          key: 'video-stream',
          videoStream: {
            codec: 'h264',
            heightPixels: 1080,
            widthPixels: 1920,
            frameRate: 1 // 每页停留1秒,可按需调整
          }
        },
        {
          key: 'audio-stream',
          audioStream: {
            codec: 'aac',
            bitrateBps: 128000
          }
        }
      ],
      muxStreams: [
        {
          key: 'output-mp4',
          container: 'mp4',
          elementaryStreams: ['video-stream', 'audio-stream']
        }
      ],
      inputConfigs: [
        {
          key: 'audio-input',
          uri: audioGcsUri,
          type: 'AUDIO'
        }
      ]
    }
  };
  return Transcoder.Projects.Locations.Jobs.create(
    jobConfig,
    `projects/${projectId}/locations/${location}`
  );
}
  1. 监听任务完成,将MP4同步回Drive
function checkJobStatus(jobName) {
  const job = Transcoder.Projects.Locations.Jobs.get(jobName);
  if (job.state === 'SUCCEEDED') {
    const [bucketName, fileName] = job.outputUri.replace('gs://', '').split('/');
    const blob = CloudStorageApp.getStorage().getBucket(bucketName).getBlob(fileName).getBlob();
    DriveApp.createFile(blob).setName('最终幻灯片视频.mp4');
    console.log('视频生成完成!');
  } else if (job.state === 'FAILED') {
    console.error('转码失败:', job.error);
  }
}

二、优化现有VM方案(快速见效)

如果暂时不想切换云服务,也可以通过以下调整大幅提升速度:

  • 替换缩略图传输为PDF传输:别再一个个拉PNG了,直接把Slides导出为PDF传到VM,用ffmpeg直接从PDF转帧,命令如下:
ffmpeg -loop 1 -i 幻灯片.pdf -i 音频.mp3 -c:v libx264 -tune stillimage -c:a aac -b:a 192k -shortest 输出.mp4

单个PDF文件的传输效率远高于数十个PNG,而且ffmpeg处理PDF的性能也更优。

  • 用Cloud Functions替代VM:把转码逻辑打包成Cloud Functions,GAS只需要触发函数并传入文件的Cloud Storage路径——按需启动的函数比一直运行的VM更高效,还能节省成本。

  • 抛弃videoshow直接用ffmpeg:videoshow是Node.js封装的ffmpeg,额外的封装层会增加开销,直接写ffmpeg命令行脚本速度更快。

三、关于GAS直接生成MP4的可能性

遗憾的是,GAS本身没有原生的视频编码/合成API,无法直接生成MP4。但通过调用上述云服务,你可以在GAS里完成整个流程的调度,相当于间接实现了“在GAS内生成”的效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:02:49