Моя конечная цель - перекодировать видеофайлы, загруженные в одну корзину GCS, перекодировать их для HLS с помощью App Engine, а затем сохранить их в другой корзине для потоковой передачи. Я начал с кода, созданного кем-то другим, который очень хорошо подходит для моего варианта использования. Прямо сейчас я просто настроил его для сохранения файлов как mp4, чтобы увидеть, работает ли он, и я не получаю сообщений об ошибках и регистрирую `` Успех '' на консоли, но когда я проверяю GCS, созданный им выходной файл составляет всего около килобайт (в основном это просто метаданные). Я считаю, что проблема связана со строкой .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 });
});
}