Как я могу отправить аудио в FFMPEG с помощью Vapoursynth?

Vapoursynth официально добавила поддержку звука в сентябре, а до этого уже тестировалась. Поскольку теперь он поддерживает звук, я хочу преобразовать некоторые старые проекты Avisynth в Vapoursynth. Частично это связано с тем, что я знаком с Python, а частично в том, что гораздо проще настроить Vapoursynth с QTGMC в моем любимом дистрибутиве Linux.

В любом случае, моя проблема в том, что когда я запускаю сценарий и передаю результат в FFMPEG, FFMPEG получает только видеопоток, а не аудиопоток. С точки зрения сценария, похоже, я должен все делать правильно, но документации по работе со звуком так мало, что я не могу быть уверен. Я склоняюсь к проблеме с моей командой vspipe, но не уверен, что нужно сделать, чтобы сказать "В этом потоке есть звук"

Вот сценарий, за которым следует команда vspipe/ffmpeg:

      import vapoursynth as vs
import havsfunc as haf
import math
core = vs.core

# Assume NTSC standard framerate and 48kHz as default
def framesToSamples(frameNum, framerate=29.97, samplerate=48000):
    return math.floor((samplerate/framerate)*frameNum)  

video = core.ffms2.Source(r'Home Movies 1 - 1989.avi', format=vs.YUV422P8)
audio = core.bas.Source(r'Home Movies 1 - 1989.avi', track=1)

video = video[71:217640]
audio = audio[framesToSamples(71):framesToSamples(217640)]

video = core.cnr2.Cnr2(video,"ooo",8,16,191,100,255,32,255,False) #VHS
video = haf.QTGMC(video, Preset="Very Slow", EZDenoise=2.0, TrueMotion=True, ChromaMotion=True, TFF=False)
video = core.std.Crop(video,4,0,4,6)
video = core.resize.Lanczos(video, 352, 240, format=vs.YUV422P10)

video.set_output(0)
audio.set_output(1)

И команда для преобразования:

      vspipe -c y4m "Home Movies 1 - 1989.vpy" - | ffmpeg -i pipe: -c:v libx265 -preset fast -crf 24 -c:a libopus -b:a 96k -ac 1 Test.mkv

1 ответ

Из того, что мне удалось найти, vspipe может выбрать один выходной поток, но не может выводить оба одновременно. В результате вам придется сделать что-то вроде этого:

      vspipe -o 1 -c wav "Home Movies 1 - 1989.vpy" - | ffmpeg -i pipe: -c:a libopus -b:a 96k -ac 1 audio.opus
vspipe -o 0 -c y4m "Home Movies 1 - 1989.vpy" - | ffmpeg -i pipe: -i audio.opus -c:v libx265 -preset ultrafast -crf 24 -c:a copy "Home Movies 1 - 1989.mkv"
rm audio.opus

Первый запуск производит звук и помещает его во временный файл. Затем второй запуск обрабатывает видео и копирует звук в окончательный видеофайл. После этого временный аудиофайл можно удалить.

Другие вопросы по тегам