NodeJS Fluent-ffmpeg不会随机地将我想要的文本添加到视频中,即使它在过滤器中

tyg4sfes  于 2022-12-18  发布在  Node.js
关注(0)|答案(1)|浏览(242)

我正在做一个简单的脚本添加一些文本到一个4秒的视频,它都工作正常,但有时它随机不添加一些文本。你可以在这里找到我的代码的相关部分:

const video = ffmpeg('path/to/video.mp4')

let index = 0
let left = true

const filters = [{
  filter: 'drawtext',
  options: {
    //fontfile:'font.ttf',
    text: title,
    fontsize: 30,
    fontcolor: 'white',
    x: '(main_w/2-text_w/2)',
    y: 130,
    shadowcolor: 'black',
    shadowx: 2,
    shadowy: 2
  }
}]

for (let thought of thoughts) {
    if (thought.length == 0) {
      continue
    }
    thought = wrap(thought, {width: 35})
    const strings = thought.split("\n")
    let line = 0
    for (const string of strings
      .filter(string => string.length > 0)
      .map(string => string.trim())
      ) {
      let yoffset = 130+(130*(index+1))+(line*20)
      if (yoffset < 0) {
        yoffset = 0
      }
      console.log(string, yoffset)
      filters.push({
        filter: 'drawtext',
        options: {
          //fontfile:'font.ttf',
          text: string,
          fontsize: 18,
          fontcolor: 'white',
          x: `(main_w${left ? "*0.3" : "*0.7"}-text_w/2)`,
          y: yoffset,
          shadowcolor: 'black',
          shadowx: 2,
          shadowy: 2
        }
      })
      line++;
    }
    index++;
    left = !left
  }

video.videoFilters(filters)
video.noAudio()

video.save('path/to/output.mp4');

wrap函数来自word-wrap(const wrap = require('word-wrap');)包Thoughts是一个不太长的字符串列表(使用wrap函数,它们最终会像2-4行一样)。
这是一个异步函数。
由于某种原因,输出视频上只显示了几行。有时候,当它不这样做时,它也会抛出一个错误,说其中一个输入无效(在处理过滤器时)。wrap函数似乎工作正常,还有yoffset,我已经打印了它们。
如果有人知道原因,请帮我解决。
我试着在思想中追逐文本,例如,这没有任何问题(显示标题和文本右,左,右,左,...)。

const thoughts = ["Nothing is on fire, fire is on things","Nothing is on fire, fire is on things","Nothing is on fire, fire is on things","Nothing is on fire, fire is on things","Nothing is on fire, fire is on things"]
j0pj023g

j0pj023g1#

这个问题解决了。对于将来来这里的人来说,我有几个问题。首先,fluent-ffmpeg在创建ffmpeg命令时使用了'符号,这意味着当添加带有'符号的句子时,它会关闭“文本”区域。
然后我补充了这样一段话:

thought = thought.replace(/'/g, "//'")

它成功了,但是带有'的部分根本就没有出现。我还没有找到一个解决方案来让带有'的文本出现,但是我只是改变了符号,因为我不认为这对我来说太重要了。

相关问题