使用 ffmpeg 对 GCS 文件进行转码



我的最终目标是对上传到一个 GCS 存储桶的视频文件进行转码,使用 App Engine 将其转码为 HLS,然后将它们存储在另一个存储桶中进行流式传输。我从其他人制作的代码开始,这些代码与我的用例非常吻合。现在我只是将其设置为将文件另存为 mp4 以查看它是否有效,并且我没有收到错误消息并将"成功"记录到控制台,但是当我检查 GCS 时,它创建的输出文件只有大约 kb(基本上它只是元数据(。我相信这个问题与.pipe(remoteWriteStream, { end: true });行和 ffmpeg 有关,因为如果我改为运行该行originStream.pipe(remoteWriteStream, {end: true});来测试.pipe功能,我会得到我所期望的(正确大小的文件的副本(。我见过很多其他人,比如这里,只是使用云功能基本上相同的方法并取得了成功。知道我哪里出错了吗?

import { Storage } from '@google-cloud/storage';
import ffmpegInstaller from '@ffmpeg-installer/ffmpeg';
import ffmpeg from 'fluent-ffmpeg';
ffmpeg.setFfmpegPath(ffmpegInstaller.path);
export default async function transcode(
//My try
name: String,
bucket: String,
suffix: String,
size: String,
): Promise<void> {
return new Promise((resolve, reject) => {
const storage = new Storage();
const originBucket = storage.bucket(bucket);
const destinationBucket = storage.bucket('storieshls-2e4b1');
const originFile = originBucket.file(name);
const originStream = originFile.createReadStream();
const remoteWriteStream = destinationBucket.file(name.replace(".MOV", ".mp4")).createWriteStream({
metadata: {
contentType: 'video/mp4', // This could be whatever else you are transcoding to
},
});
//originStream.pipe(remoteWriteStream, {end: true});
ffmpeg()
.input(originStream)
.outputOptions('-c:v copy') // Change these options to whatever suits your needs
.outputOptions('-c:a aac')
.outputOptions('-b:a 160k')
.outputOptions('-f mp4')
.outputOptions('-preset fast')
.outputOptions('-movflags frag_keyframe+empty_moov')
.on('start', cmdLine => {
console.log(`[${suffix}] Started FFMpeg`, cmdLine);
})
.on('end', () => {
console.log(`[${suffix}] Success!.`);
resolve();
})
.on('error', (err: Error, stdout, stderr) => {
console.log(`[${suffix}] Error:`, err.message);
console.error('stdout:', stdout);
console.error('stderr:', stderr);
reject();
})
.pipe(remoteWriteStream, { end: true });
});
}

您需要生成GCS文件的公共URL,并在ffmpeg函数中传递该URL。

ffmpeg(file_url)
.output(basename + '-1280x720.mp4')
.videoCodec('libx264')  
.size('1280x720')
.output(basename + '-1920x1080.mp4')
.videoCodec('libx264')
.size('1920x1080')
.on('error', function(err) {
console.log('An error occurred: ' + err.message);
})  
.on('progress', function(progress) { 
console.log('... frames: ' + progress.frames);
})
.on('end', function() { 
console.log('Finished processing'); 
})
.run();

最新更新