Перекодируйте файлы GCS с помощью ffmpeg - PullRequest
0 голосов
/ 28 мая 2020

Моя конечная цель - перекодировать видеофайлы, загруженные в одну корзину 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 });
  });
}

1 Ответ

0 голосов
/ 12 августа 2020

Вам необходимо создать pubi c URL-адрес файла GCS и передать этот URL-адрес в функции ffmpeg .

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();
...