Реклама на сайте Advertise with us

Бегущая строка с помощью ffmpeg

Расширенный поиск по форуму
 
Новая тема Новая тема   
Автор
Поиск в теме:



С нами с 06.10.11
Сообщения: 295
Рейтинг: 258

Ссылка на сообщениеДобавлено: 30/07/18 в 13:59       Ответить с цитатойцитата 

Задача: при конвертации видео файла нужно вставлять текст (что то типа This video uploaded...) бегущей строкой.
У ffmpeg для этого есть фильтр drawtext , который по умолчанию вставляет текст на весь видеофайл, т.е. от начала до конца. Для указания конкретного времени отображения текста используется тег enable=between(t, 10, 20) , где 10 и 20 - время начала и окончания вставки текста, в секундах.

Вопрос: т.к. видосы разной продолжительности, каким образом вставлять текст единажды , продолжительностью 10 сек, в середине видоса ? К примеру, если видос длительностью 3 мин - текст вставляется с 00:01:30 по 00:01:40 .

Понятное дело что можно было бы изначально определять длительность видоса, а затем подставлять нужную цифру в between , но в конкретном случае не выйдет, т.к. нужно оформить это дело одной строкой, которая используется сторонним скриптом в качестве "Опции FFmpeg".

Заранее спасибо!

2
 
+


С нами с 09.05.17
Сообщения: 661
Рейтинг: 586


Передовик Master-X (01.08.2017) Передовик Master-X (01.02.2018) Передовик Master-X (16.10.2019) Передовик Master-X (01.11.2019)
Ссылка на сообщениеДобавлено: 30/07/18 в 15:01       Ответить с цитатойцитата 

тебе нужно получить длительность видео через ffprobe и на основе этих данных посчитать куда вставлять бегущую строку ( movieDuration/2 )

Пример функции на golang для данной задачи

Код:


func getDuration(videoPath string) string {

   args := " -i " + videoPath + " -show_format -v quiet"

   parts := strings.Fields(args)
   cmd := exec.Command("ffprobe", parts...)

   var out bytes.Buffer
   cmd.Stdout = &out

   err := cmd.Run()
   if err != nil {
      log.Printf("ffprobe finished with error: %v", err)
   }

   re1 := regexp.MustCompile(`duration=(.\d*)`)
   result1 := re1.FindAllStringSubmatch(out.String(), -1)
   if len(result1) != 0 {
      return result1[0][1]
   }
   return "0"

}



не узнавая сначала длительность видео, никак...

Покупаем пуш траффик
GoPusher 2 - рули своими пуш подписчиками

3
 
+


С нами с 09.05.17
Сообщения: 661
Рейтинг: 586


Передовик Master-X (01.08.2017) Передовик Master-X (01.02.2018) Передовик Master-X (16.10.2019) Передовик Master-X (01.11.2019)
Ссылка на сообщениеДобавлено: 30/07/18 в 15:09       Ответить с цитатойцитата 

Хотя может как то так будет работать, негде сейчас проверить

Код:
between(t, t/2-5 , t/2+5)

Покупаем пуш траффик
GoPusher 2 - рули своими пуш подписчиками

2
 



С нами с 06.10.11
Сообщения: 295
Рейтинг: 258

Ссылка на сообщениеДобавлено: 30/07/18 в 15:26       Ответить с цитатойцитата 

Oswell E. Spencer писал:
Хотя может как то так будет работать, негде сейчас проверить

Код:
between(t, t/2-5 , t/2+5)

Не, так я пробовал еще до того как топик этот создавать. К сожалению не работает.

Про ffprobe я тоже знаю, но к сожалению в данном случае такой вариант не подходит, т.к. в скрипте (KVS в данном случае) есть только поле , в которое можно вписать только опции ffmpeg , которые потом выполняются как :
Код:
/usr/bin/ffmpeg -y -i input_file.mp4 тут_опции_которые_вписаны_в_поле  output_file.mp4


И да. Спасибо что подтвердил мои догадки. Тоже почему то казалось изначально, что сделать это без предварительного определения длительности - невозможно.

2
 



С нами с 14.03.14
Сообщения: 294
Рейтинг: 410

Ссылка на сообщениеДобавлено: 30/07/18 в 15:31       Ответить с цитатойцитата 

а у парней из поддержки KVS не спрашивал?

0
 
Новая тема Новая тема   

Текстовая реклама в форме ответа
Заголовок и до четырех строчек текста
Длина текста до 350 символов
Купить рекламу в этом месте!


Перейти:  



Спонсор раздела Стань спонсором этого раздела!

Реклама на сайте Advertise with us

Опросы

Рецепт новогоднего блюда 2022



Обсудите на форуме обсудить (11)
все опросы »