簡體   English   中英

Fluent ffmpeg 不同步運行

[英]Fluent ffmpeg not running synchronously

我正在編寫一個程序,我需要使用 ffmpeg 多次處理視頻。 ffmpeg 代碼(如下)位於承諾的“then”語句中。

ffmpeg(path)
  .size('640x?')
  .aspect('1:1')
  .autopad('#682BAB')
  .saveToFile(`${userDirPath}/11-${userFileName}`)
  .on('end', () => {
    ffmpeg()
      .input('test-11-start.mp4')
      .mergeAdd(`${userDirPath}/11-${userFileName}`)
      .mergeAdd('test-11-end.mp4')
      .mergeToFile(`${userDirPath}/11-final-${userFileName}`, 'temp/')
      .on('end', () => console.log('FFmpeg done!'));
  });

在此之后還有另一個 ffmpeg 函數(相同,但具有不同的縱橫比),然后是帶有其他一些函數的“then”語句。

問題是這個 ffmpeg 函數是異步運行的,接下來的語句(使用 ffmpeg func 的結果文件)在它完成執行之前執行,所以我希望它同步運行。 我試過 async await(如下),但它仍然異步運行。 代碼有什么問題?

async function ffmpegMerge() {
  try {
    await ffmpeg(path)
    .size('640x?')
    .aspect('1:1')
    .autopad('#682BAB')
    .saveToFile(`${userDirPath}/11-${userFileName}`)
    .on('end', () => {
      ffmpeg()
        .input(`test-11-start.mp4`)
        .mergeAdd(`${userDirPath}/11-${userFileName}`)
        .mergeAdd(`test-11-end.mp4`)
        .mergeToFile(`${userDirPath}/11-final-${userFileName}.mp4`, 'temp/')
        .on('end', () => console.log('FFmpeg done!'));
    })
  }
  catch (err) {
    return Promise.reject(new Error(err));
  }
}

使用promise創建一個function並使用await等待該function被解析。

這是一個同步使用ffmpeg的例子:

function ffmpegSync(){
   return new Promise((resolve,reject)=>{
      ffmpeg(path)
         .size('640x?')
         .aspect('1:1')
         .autopad('#682BAB')
         .saveToFile(`${userDirPath}/11-${userFileName}`)
         .on('end', () => {
            ffmpeg()
               .input(`test-11-start.mp4`)
               .mergeAdd(`${userDirPath}/11-${userFileName}`)
               .mergeAdd(`test-11-end.mp4`)
               .mergeToFile(`${userDirPath}/11-final-${userFileName}.mp4`, 'temp/')
               .on('end', () => console.log('FFmpeg done!'));
               resolve()
         })
         on('error',(err)=>{
            return reject(new Error(err))
         })
   })
}

現在只需使用函數ffmpegSyncawait

 createThumbnailForVideo().then(()=>{
      console.log('ok');
 })


 function createThumbnailForVideo(){

    return new Promise((resolve,reject)=>{

       const ffmpegInstaller = require('@ffmpeg-installer/ffmpeg');
       const ffmpeg = require('fluent-ffmpeg');
       ffmpeg.setFfmpegPath(ffmpegInstaller.path);
       var path = require('path'), // Default node module
       pathToFile = path.join(__dirname, 'tempfiles', fileName),
       pathToSnapshot = path.join(__dirname, 'tempfiles');

       var proc = ffmpeg(pathToFile)
        .on('filenames', (filenames)=> {})
        .on('end', (data)=> {
          console.log('screenshots were saved');
      
        })
        .on('error', (err)=> {
          console.log('an error happened: ' + err.message);
          return reject(new Error(err))
        })
        .takeScreenshots({ count: 1,filename:`thumb_${onlyName}.png`, timemarks: [ '00:00:01.000' ], size: '250x?' },pathToSnapshot)
        .on('end', () => {
          console.log('FFmpeg done!')
          resolve()
        })
        .on('error', (err)=> {
          console.log('an error happened: ' + err.message);
          return reject(new Error(err))
        })
      
   })

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM