如何在Google Apps Script内生成带音频的Google Slides转MP4?求更快方案
我明白你当前的痛点——用GAS拉取幻灯片缩略图再传到VM转码,不仅慢还容易超时。其实GAS本身没有原生的视频生成能力,但我们可以通过利用Google云生态的原生服务或者优化现有流程来大幅提升效率,甚至比你看到的Marketplace插件更快。
一、最优方案:用Google Cloud Transcoder API替代VM转码
Marketplace插件之所以快,大概率是调用了Google的云原生转码服务,而非自己维护VM。你可以直接复用这套能力,步骤如下:
核心逻辑
把幻灯片导出为PDF、音频传到Cloud Storage,然后用Transcoder API直接合成MP4——全程在Google云内部流转,没有跨网络的大文件传输,转码效率拉满。
具体实现步骤(GAS代码示例)
启用必要的高级服务:在GAS编辑器的「资源」→「高级Google服务」里,开启
Drive API、Cloud Storage和Cloud Transcoder API,同时在Google Cloud控制台启用对应API并配置权限。导出Slides为PDF到Drive
function exportSlidesToPDF(slideId) { const pdfFile = Drive.Files.export(slideId, 'application/pdf', { supportsAllDrives: true }); return pdfFile.id; }
- 将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}`; }
- 调用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}` ); }
- 监听任务完成,将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

