ffmpeg- python drawtext после объединения видео в формате mp4 - PullRequest
1 голос
/ 02 марта 2020

Я понимаю, что подобный вопрос был задан здесь, поэтому прежде чем указывать на этот вопрос и ответить , пожалуйста, поймите, что мой вопрос отличается. Я надеюсь, что кто-то может указать мне правильное направление.

Короче говоря, у меня есть 5 сегментов видео, которые я объединяю и переупорядочиваю на основе пользовательского ввода. Есть ли способ, которым я могу динамически рисовать текст поверх ввода, не обрабатывая видео второй раз?

Это мой код, который работает, но, как вы видите, мне нужно открыть объединенный файл и примените текст к этой версии. Затем файл сохраняется как дубликат.

Я ищу более элегантный способ выполнить sh. Любые предложения будут оценены.

        video1 = ffmpeg.input('./assets/v_1.mp4')
        video2 = ffmpeg.input('./assets/v_2.mp4')
        video3 = ffmpeg.input('./assets/v_3.mp4')
        video4 = ffmpeg.input('./assets/v_4.mp4')
        video5 = ffmpeg.input('./assets/v_5.mp4')



        print(row)

        ## IF Row 1 and 2 have values they get all five.
        if row[1] == '1' and row[2] == '1':
            print("Matches here");
            outfile = row[0]+'.mp4'
            ##DO Stuff
            joined = ffmpeg.concat(video1.video,video1.audio,video2.video,video2.audio,video3.video,video3.audio,video4.video,video4.audio,video5.video,video5.audio, v=1,a=1,unsafe=1).node
            vj = joined[0]
            va = joined[1].filter('volume', 1)

            out = ffmpeg.output(vj,va, outfile)
            out.run()
            ## Once Concat Video is finished, then it draws text over the video. 
            input2 = ffmpeg.input(row[0]+'.mp4').drawtext(fontfile='/Users/jserra/Library/Fonts/Cocogoose-Condensed-Regular-trial.ttf',fontsize='60',timecode='00:00:00:00',r=60,text=row[0],fontcolor='black',escape_text=True)
            ffmpeg.output(input2,row[0]+'_1.mp4').run()

Я пробовал это и получаю следующую ошибку:

video1 = ffmpeg.input('./assets/StMarys_1.mp4').drawtext(fontfile='/Users/jserra/Library/Fonts/Cocogoose-Condensed-Regular-trial.ttf',fontsize='60',timecode='00:00:00:00',r=60,text=row[0],fontcolor='black',escape_text=True)

Ошибка:

    .virtualenvs/cvtesting/lib/python3.6/site-packages/ffmpeg/_run.py", line 93, in _allocate_filter_stream_names
    upstream_node, upstream_label
ValueError: Encountered drawtext(fontcolor='black', fontfile='/Users/jserra/Library/Fonts/Cocogoose-Condensed-Regular-trial.ttf', fontsize='60', r=60, text='jack', timecode='00:00:00:00') <1d2ff6bbf3f0> with multiple outgoing edges with same upstream label None; a `split` filter is probably required

Я также попытался создать цепочку после объединения видео с joined. Я все еще получаю ошибки.

joined = ffmpeg.concat(video1.video,video1.audio,video2.video,video2.audio,video3.video,video3.audio,video4.video,video4.audio,video5.video,video5.audio, v=1,a=1,unsafe=1).drawtext(fontfile='/Users/jserra/Library/Fonts/Cocogoose-Condensed-Regular-trial.ttf',fontsize='60',timecode='00:00:00:00',r=60,text=row[0],fontcolor='black',escape_text=True).node

Нужно ли обрабатывать эти видео дважды? Если есть какие-либо оптимизации, которые я могу сделать, пожалуйста, дайте мне знать. Кроме того, если есть какие-либо указатели относительно отображения нарисованного текста в течение определенного периода времени, документация выглядит довольно нечеткой, поскольку она касается контроля длительности, я не уверен, что значения означают или как они влияют друг на друга.

Спасибо

1 Ответ

0 голосов
/ 03 марта 2020

Хорошо, так что для тех, кто испытывает проблемы с примерами, которые не являются переводом 1: 1, это то, что я понял.

Если я применяю фильтр отрисовки текста к видео, которое возвращается в объединенном [0], я могу добавить текст в нужном месте, не кодируя и не обрабатывая видео дважды.

I ' Я предполагаю, что это связано с тем фактом, что drawtext может применяться только к видео, а не к аудио (что имеет смысл).

## IF Row 1 and 2 have values they get all five.
        if row[1] == '1' and row[2] == '1':
            print("Matches here");
            outfile = row[0]+'.mp4'

            ##DO Stuff
            joined = ffmpeg.concat(video1.video,video1.audio,video2.video,video2.audio,video3.video,video3.audio,video4.video,video4.audio,video5.video,video5.audio, v=1,a=1,unsafe=1).node

            print(type(joined))
            print(joined);
            vj = joined[0].drawtext(fontfile='/Users/js/Library/Fonts/Cocogoose-Condensed-Regular-trial.ttf',fontsize='600',x=100,y=10,text=row[0],fontcolor='white',escape_text=True,enable='between(t,1,2.5)')
            va = joined[1].filter('volume', 1)

            out = ffmpeg.output(vj,va, outfile)
            out.run()

Я уверен, что это не полное объяснение, но, похоже, быть тем, что имеет смысл в свете теста, который я провел. В моем первом примере, описывающем проблему, аудио было удалено из видео после второй обработки. Это то, что дало мне идею применить фильтр drawtext только к видео, возвращенному в joined[0], так как оно казалось конкурирующим со звуком.

...