Re[5]: Попинайте меня ещё раз с фрилансерами
От: reversecode google
Дата: 15.10.23 22:08
Оценка: 2 (1) +1 :)
так оно в своей основе запускает ffmpeg
а по условиям задачи оно не должно было форкать ffmpeg который якобы нужным функционалом не обладал
Re[7]: Попинайте меня ещё раз с фрилансерами
От: DiPaolo Россия  
Дата: 16.10.23 07:26
Оценка: +3
Судя по вашему ответу могу сказать одно: смысла в следующий раз приходить плакаться на форум, какие все вокруг дураки, нет. Потому что вы не воспринимаете обратную связь: ни в прошлый раз, ни сейчас.
Патриот здравого смысла
Re[4]: Попинайте меня ещё раз с фрилансерами
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 18.09.23 16:44
Оценка: 14 (2)
Здравствуйте, vsb, Вы писали:

vsb>Я понял, мне просто для общего развития интересно понять, чем обусловлено это требование. Вроде ffmpeg позиционируется на ближайший стоп-кадр за условно O(1), а дальше уже пролистывает кадры.


Вроде как всё не так просто. Посмотри, как оно делается: вот
Re: Попинайте меня ещё раз с фрилансерами
От: vsb Казахстан  
Дата: 18.09.23 12:26
Оценка: +2
А чем плохо вызывать ffmpeg N раз, по разу для каждого отрезка?
Re[2]: Попинайте меня ещё раз с фрилансерами
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 18.09.23 12:46
Оценка: +2
Здравствуйте, namespace, Вы писали:

N>Напиши проще, что нужно залезть в исходники ffmpeg и допилить под твои требования.


Там не надо лазать даже, задача простая, пишется примерно за вечер на С++ или Питоне. На баше может не получиться попасть в точное время для потокового кодека и редкими ключевыми кадрами.
Re[5]: Попинайте меня ещё раз с фрилансерами
От: Gt_  
Дата: 19.09.23 12:12
Оценка: -2
Здравствуйте, Nuzhny, Вы писали:

N>Здравствуйте, Gt_, Вы писали:


Gt_>>на кой делать проход всего файла, если можно сделать пару seek. выглядит, что чувак не адекватен, соответственно и исполнители держаться подальше.


N>В общем виде seek — это O(N) + декодирование M кадров, где M — это расстояние между соседними ключевыми кадрами.


в общем случае seek это seek, а не вычитка всего файла. читать весь файл просто глупо.
Re[7]: Попинайте меня ещё раз с фрилансерами
От: reversecode google
Дата: 16.10.23 01:22
Оценка: +2
давайте я возьму дерзость и выскажусь за всех флиралсеров ктыва и тем кто к вам возможно еще отзывался на вак на хабре

Вот уже один предложил написать скрипт на Ruby (почему не Bash, Карл?) и дёргать ffmpeg

они(и я) поняли вас так что
ffmpeg не обладает нужным функционалом
и какие то говно скрипты итд вы не хотите
значит нужно было лезть в ffmpeg и через api
писать свое решение которое бы цепляло ffmpeg как либу

где у вас произошел разрыв в понимании предлагаю разобраться самому
на будущее пригодиться
Re[9]: Попинайте меня ещё раз с фрилансерами
От: DiPaolo Россия  
Дата: 17.10.23 00:30
Оценка: +2
S>>Тем не менее, выбранная вами для работы moviepy делает именно это -- запускает бинарник ffmpeg и читает бинарные данные с его стандартного вывода (формирование командной строки, запуск, чтение).
C>Отлично, это непринципиально. Главное, что идёт правильное декодирование видео, а не просто вырезается кусок данных.

Еще как принципиально. Этот "нюанс" все меняет в корне дела. Более того, вы сами с упорством всем тут доказывали, что так как вы в итоге сделали — делать ни в коем случае нельзя. А потом: фиииии, вот дурачки, можно же было простым образом за два часа сделать. Ну так вам и предлагали с самого начала такое решение.

Патриот здравого смысла
Re: Попинайте меня ещё раз с фрилансерами
От: Pzz Россия https://github.com/alexpevzner
Дата: 18.09.23 13:06
Оценка: 15 (1)
Здравствуйте, cppguard, Вы писали:

C>P.S. Вот уже один предложил написать скрипт на Ruby (почему не Bash, Карл?) и дёргать ffmpeg. Видимо, я недостаточно внятно написал, что ffmpeg не умеет нужную функцию из коробки.


Недели две, Go + libffmpeg, сделаю автодетект входных форматов (и не буду парить моск, если там окажутся файлы в разных форматах), но выходной формат должен как-то задаваться. Дам пожизненную гарантию на исправление своих ошибок. 500К руб. Через хабр отвечать лень, ты все равно не захочешь столько платить.

P.S. А что делать, если во входных файлах нет заказанного интервала? Ругаццо матерно или гнать "настроечную таблицу"? А если он есть, но не совсем?

P.P.S. Формат UNIX timestamp следует уточнить. RFC-3339? Но это уже мелочи и детали, впрочем.
Re: Попинайте меня ещё раз с фрилансерами
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 18.09.23 13:38
Оценка: +1
Здравствуйте, cppguard, Вы писали:

C>Что теперь не так?

Да всё так. Опять те же мутные формулировки. Нарисовал бы картинку что ли. Зачем-то приплёл "Сортировка файлов по имени совпадает с сортировкой файлов в хронологическом порядке". Зачем это нужно? Для кого? Мне не очевидно, что подаётся на вход программы кроме директории куда надо сохранить отрезки и что собственно резать, граничные условия и т.п. Задачу в общем случае не решить без транскодинга и тут открывается портал вопросов... Предположим, я знаю ffmpeg и работаю по ставке ну пусть будет 40$ в час. Задачку оценю часов на 20-40 включая все твои хотелки которые нифига не понятны из описания, а значит ты будешь совокуплять мне мозг.
C>- В ffmpeg есть встроенные средства, чтобы верезать видео по заданным временным меткам
Не надо писать что есть, а чего нет. Пиши что тебе надо и всё, люди сами знают и скажут тебе как проще сделать, а ты можешь сказать что это тебе не подходит. Хуже всего, это заказчики которые что-то там посмотрели и УЖ ТОЧНО знают как оно на самом деле работает. Если знаешь — делай сам, только мы вот видели как ты сделал по своей же формулировке.
Sic luceat lux!
Re[5]: Попинайте меня ещё раз с фрилансерами
От: DiPaolo Россия  
Дата: 16.10.23 01:31
Оценка: +1
Ну ровно как и в прошлый раз: ключевое и самое трудозатратное требование ТЗ не выполнено

1. В ТЗ:

- В ffmpeg есть встроенные средства, чтобы верезать видео по заданным временным меткам, но только для одного отрезка. Данная работа предполагает, что программа будет за одни проход по исходному видео вырезать все отрезки.


У вас FFmpeg запускается отдельно для каждого отрезка. Такого по условию быть не должно. И выше в треде вы с упорством доказывали, что FFmpeg не подходит и такое не умеет, когда вам предлагали абсолютно такое же решение.

2. Кроме того, временные метки не читаются из имени файла, как заявлено в задании:

- В директории с результатом должны быть отрезки видео из общего архива за день (одна из папок YYYYMMDD), соответствующие временным меткам из файла .CSV.


У вас это передается как параметр в скрипт.

3. Еще одно требование звучало совсем иначе в ТЗ, и, ИМХО, не выполнено:

- Временной отрезок может включать конец одного исходного видео и начало другого. Программа должна корректно это обрабатывать.


            # Sanitize start and end time values
            start_time = max(0, min(start_time, total_duration))
            end_time = max(start_time, min(end_time, total_duration))

            duration = end_time - start_time


Ну тут мы просто проверяем не выход за границы. По условию это выглядело скорее, что пересечение попадет и в первый, и во второй выходные клипы.
Патриот здравого смысла
Re[7]: Попинайте меня ещё раз с фрилансерами
От: so5team https://stiffstream.com
Дата: 16.10.23 07:44
Оценка: +1
Здравствуйте, cppguard, Вы писали:

DP>>1. В ТЗ:

DP>>

DP>>- В ffmpeg есть встроенные средства, чтобы верезать видео по заданным временным меткам, но только для одного отрезка. Данная работа предполагает, что программа будет за одни проход по исходному видео вырезать все отрезки.


DP>>У вас FFmpeg запускается отдельно для каждого отрезка. Такого по условию быть не должно. И выше в треде вы с упорством доказывали, что FFmpeg не подходит и такое не умеет, когда вам предлагали абсолютно такое же решение.

C>Вероятно, произошла путаница между ffmpeg и libffmpeg. От последнего я не отказывался. А бинарник умеет только по-тупому вытягивать отрезок видео.

Тем не менее, выбранная вами для работы moviepy делает именно это -- запускает бинарник ffmpeg и читает бинарные данные с его стандартного вывода (формирование командной строки, запуск, чтение).

Т.е. это напрямую то, что вам предлагали делать (но на Ruby, а не на Python), но вы категорически этого не хотели:

Вот уже один предложил написать скрипт на Ruby (почему не Bash, Карл?) и дёргать ffmpeg. Видимо, я недостаточно внятно написал, что ffmpeg не умеет нужную функцию из коробки.


DP>>3. Еще одно требование звучало совсем иначе в ТЗ, и, ИМХО, не выполнено:

DP>>

DP>>- Временной отрезок может включать конец одного исходного видео и начало другого. Программа должна корректно это обрабатывать.

DP>>Ну тут мы просто проверяем не выход за границы. По условию это выглядело скорее, что пересечение попадет и в первый, и во второй выходные клипы.

C>Ну вот, теперь ещё нужно разжёвывать, как код работает Извините, я на такое не подписывался. Опубликованная программа делает ровно то, что я описал, в том числе и правильное вырезание клипа, если временной отрезок охватывает больше одного исходного видео.


Из вашего описания у меня лично (а может и не у меня одного?) сложилось впечатление, что если в csv файле задано что-то вроде:
60, 180,
0, 30
90, 180

Т.е. сперва фрагмент (00:01:00-00:04:00), затем фрагмент (00:00:00-00:00:30), затем фрагмент (00:01:30-00:04:30).

И на выходе должно получиться два файла: один с фрагментом (00:00:00-00:00:30), второй с фрагментом (00:01:00-00:04:30).

Причем делать это нужно было за один проход по файлу, т.е. сперва нужно было сделать файл с фрагментом (00:00:00-00:00:30), затем уже файл с фрагментом (00:01:00-00:04:30).

/Круглые скобки вверху были использованы только для того, чтобы не колупаться тегами разметки, которые на RSDN записываются в квадратных скобках/

Я совсем плохо знаю Python и поэтому не вижу как это делается в вашем цикле чтения строк из csv-файла... Но, есть ощущение, что там этого нет вообще.

Или же что исходное условие было сформулировано так, что трактуется неоднозначно.
Отредактировано 16.10.2023 7:45 so5team . Предыдущая версия .
Re[8]: Попинайте меня ещё раз с фрилансерами
От: cppguard  
Дата: 16.10.23 18:39
Оценка: :)
Здравствуйте, so5team, Вы писали:

S>Тем не менее, выбранная вами для работы moviepy делает именно это -- запускает бинарник ffmpeg и читает бинарные данные с его стандартного вывода (формирование командной строки, запуск, чтение).

Отлично, это непринципиально. Главное, что идёт правильное декодирование видео, а не просто вырезается кусок данных.

S>Из вашего описания у меня лично (а может и не у меня одного?) сложилось впечатление, что если в csv файле задано что-то вроде:

S>
S>60, 180,
S>0, 30
S>90, 180
S>

S>Т.е. сперва фрагмент (00:01:00-00:04:00), затем фрагмент (00:00:00-00:00:30), затем фрагмент (00:01:30-00:04:30).

S>И на выходе должно получиться два файла: один с фрагментом (00:00:00-00:00:30), второй с фрагментом (00:01:00-00:04:30).


S>Причем делать это нужно было за один проход по файлу, т.е. сперва нужно было сделать файл с фрагментом (00:00:00-00:00:30), затем уже файл с фрагментом (00:01:00-00:04:30).


S>/Круглые скобки вверху были использованы только для того, чтобы не колупаться тегами разметки, которые на RSDN записываются в квадратных скобках/


S>Я совсем плохо знаю Python и поэтому не вижу как это делается в вашем цикле чтения строк из csv-файла... Но, есть ощущение, что там этого нет вообще.


S>Или же что исходное условие было сформулировано так, что трактуется неоднозначно.


Нет, всё не так. Для примера выше должно быть три выходных файла. Разные отрезки логически между собой никак не связаны.
Re[11]: Попинайте меня ещё раз с фрилансерами
От: DiPaolo Россия  
Дата: 17.10.23 03:30
Оценка: +1
C>В ffmpeg есть ключик "-s" (кажется, лень проверять), который тупо копирует кусок видео по заданному временному отрезку. Не декодирует, а именно копирует. Я не знаю, зачем этот режим вообще добавили, но минус такого решения — если временной отрезок попадает между двух ключевых кадров, то кусок видео до ключевого кадра от начала вырезанного клипа будет "жёванным". И именно это решение находится на первой странице поиска гугла. Поэтому я предположил, что потенциальные исполнители перед тем, как сделать отклик, загуглять "ffmpeg extract segment", увидят вот этот хромой способ и подумают, что это лёгкие деньги. И хотел как-то донести, что меня этот способ не устраивает. Вероятно, правильно было бы таки расписать подробно, что такой ключ в программе есть, но пользоваться им нельзя. Так что да — с вашей стороны выглядит, словно я поменял ТЗ на ходу, с моей стороны — способ уберечься от проходимцев.



Все попереврали.

— параметр -ss все вырезает как надо:

The input will be parsed using keyframes, which is very fast. As of FFmpeg 2.1, when transcoding with ffmpeg (i.e. not stream copying), -ss is now also "frame-accurate" even when used as an input option.
...
This approach uses keyframes to seek until 00:22:30, and then seeks frame-by-frame until it reaches 00:23:00 (00:22:30 + 00:00:30)

(https://trac.ffmpeg.org/wiki/Seeking)

— именно этот параметр используется в вашем решении:
        if start_time != 0:
            offset = min(1, start_time)
            i_arg = [
                "-ss",
                "%.06f" % (start_time - offset),
                "-i",
                self.filename,
                "-ss",
                "%.06f" % offset,
            ]
        else:
            i_arg = ["-i", self.filename]

(https://github.com/Zulko/moviepy/blob/bc8d1a831d2d1f61abfdf1779e8df95d523947a5/moviepy/video/io/ffmpeg_reader.py#L85C1-L96C42)

Вы же за фидбэком сюда пришли. Вам уже несколько человек сказали, как ваше задание и поведение выглядит со стороны для других людей. Может уже стоит признать, что ваше задание было непонтяным для других, а не зарываться все глубже в отмазки? Выглядит смешно и непрофессионально.

Чтобы подобных казусов не было, рекомендую вам просто писать ЧТО вы хотите, а не КАК вам надо сделать. Ну просто не выежываться, а написать как клиент. А если уж сами все понимаете — ну так делайте сами и мозги никому не грейте.

– Степан, у гостя карета сломалась…
– Вижу, барин. Ось полетела, да спицы менять надо.
– Починить сможешь?
– За день сделаю.
– А за два? Степан глянул на барина, перевел взгляд на карету:
– Можно и за два.
– А за пять?. Степан задумчиво почесал в затылке:
– Трудновато, барин. Но ежели постараться, можно и за пять…
– А за десять дней? Степан аж крякнул:
– Ну, барин, тут тогда самому не справиться. Помощник нужен. Хомо сапиенс!

Патриот здравого смысла
Re[12]: Попинайте меня ещё раз с фрилансерами
От: cppguard  
Дата: 17.10.23 22:26
Оценка: :)
Здравствуйте, DiPaolo, Вы писали:

DP>Все попереврали.

stream copying <- вот об этом я говорил. Это мне НЕ нужно было.

DP>Вы же за фидбэком сюда пришли. Вам уже несколько человек сказали, как ваше задание и поведение выглядит со стороны для других людей. Может уже стоит признать, что ваше задание было непонтяным для других, а не зарываться все глубже в отмазки? Выглядит смешно и непрофессионально.


Возможно. Но я не вижу, что я где-то отмазываюсь? От чего вообще тут можно отмазываться? Я никого не обвиняю, меня никто не обвиняет (кроме тупых набросов). Я задался целью выяснить, почему я с полпинка не могу найти фрилансеров. Считаю, что примерно выяснил, почему.

DP>Чтобы подобных казусов не было, рекомендую вам просто писать ЧТО вы хотите, а не КАК вам надо сделать. Ну просто не выежываться, а написать как клиент. А если уж сами все понимаете — ну так делайте сами и мозги никому не грейте.


Стоит попробовать.
Re[15]: Попинайте меня ещё раз с фрилансерами
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 20.10.23 14:54
Оценка: +1
Здравствуйте, cppguard, Вы писали:

C>В 2012-ом, когда я впервые вышел на фриланс, рынок был другим. Я сам выяснял, что нужно заказчику, и предлагал возможные варианты решений. Сейчас, чтобы не вылететь в трубу и не платить сотни тысяч, за простенький скрипт, заказчику требуется основательно подойти к описанию ТЗ. Но это только догадки. Вероятно, что на международном рынке фриланса всё так же можно за недорого найти исполнителя, который сам по словесному описанию составит ТЗ и быстро всё сделает, но для этого нужно мутить с виртуальной валютной картой. Пока что ChatGPT является приемлемой альтернативой.

Ничего ты так и не понял...
Sic luceat lux!
Попинайте меня ещё раз с фрилансерами
От: cppguard  
Дата: 18.09.23 11:26
Оценка:
https://freelance.habr.com/tasks/526531

Что теперь не так? Бюджет — любой, просто назовите сумму. Всего 3 пункта в ТЗ. Из 13 откликов — 3 более-менее адекватных, но только один чётко ответил по стоимости, сроками и зависимостям. Если есть свободное время, то милости прошу меня убедить в том, что я снова ставлю невыполнимую задачу. Моё мнение остаётся неизменным — адекватных исполнителей не осталось. Хотите организовать стартап, не ввалив миллионы ещё на этапе протитипирования? — Учитесь программировать. По прошествии трёх дней попробую нанять парочку исполнителей и отпишусь о результате.

P.S. Вот уже один предложил написать скрипт на Ruby (почему не Bash, Карл?) и дёргать ffmpeg. Видимо, я недостаточно внятно написал, что ffmpeg не умеет нужную функцию из коробки.
Re: Попинайте меня ещё раз с фрилансерами
От: GarryIV  
Дата: 18.09.23 11:34
Оценка:
Здравствуйте, cppguard, Вы писали:

C>https://freelance.habr.com/tasks/526531


Тебе одного мало или что?
WBR, Igor Evgrafov
Re[2]: Попинайте меня ещё раз с фрилансерами
От: cppguard  
Дата: 18.09.23 11:37
Оценка:
Здравствуйте, GarryIV, Вы писали:

GIV>Тебе одного мало или что?


Разумеется, мало. Я обычно нанимаю двух или трёх, потому что один обязательно сливается, потому что переоценил свои силы.
Re: Попинайте меня ещё раз с фрилансерами
От: prakop  
Дата: 18.09.23 11:39
Оценка:
> В ffmpeg есть встроенные средства, чтобы верезать видео по заданным временным меткам, но только для одного отрезка.

Первая же ссылка в гугле на SO говорит об обратном. Очевидно, что с таким заказчиком-экспертом себе же дороже работать выйдет.
Re[2]: Попинайте меня ещё раз с фрилансерами
От: cppguard  
Дата: 18.09.23 11:48
Оценка:
Здравствуйте, prakop, Вы писали:

P>Первая же ссылка в гугле на SO говорит об обратном. Очевидно, что с таким заказчиком-экспертом себе же дороже работать выйдет.


Ох, началось Ну так напиши обёртку на bash, которая вызывает ffmpeg для моей задачи, я тебе 50 000 заплачу. А если окажется, что я прав — ты мне 25 000, идёт?
Re[3]: Попинайте меня ещё раз с фрилансерами
От: prakop  
Дата: 18.09.23 12:17
Оценка:
C>Ох, началось Ну так напиши обёртку на bash, которая вызывает ffmpeg для моей задачи, я тебе 50 000 заплачу. А если окажется, что я прав — ты мне 25 000, идёт?

Не виляй. Твои слова: "В ffmpeg есть встроенные средства, чтобы верезать видео по заданным временным меткам, но только для одного отрезка.". ffmpeg позволяет вырезать несколько отрезков. На карту переведёшь или по номеру?
Re: Попинайте меня ещё раз с фрилансерами
От: namespace  
Дата: 18.09.23 12:19
Оценка:
C>Что теперь не так?
Для тех, кто не имел дела с видео, выглядит сложно, и непонятно сколько времени займет.
Напиши проще, что нужно залезть в исходники ffmpeg и допилить под твои требования.
Дописать новую функцию с параметрами: xxx, yyy, zzz
Re[2]: Попинайте меня ещё раз с фрилансерами
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 18.09.23 13:44
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>А чем плохо вызывать ffmpeg N раз, по разу для каждого отрезка?

В условиях задачи сказано — за один проход.
Sic luceat lux!
Re[3]: Попинайте меня ещё раз с фрилансерами
От: Gt_  
Дата: 18.09.23 13:51
Оценка:
Здравствуйте, Kernan, Вы писали:

K>Здравствуйте, vsb, Вы писали:


vsb>>А чем плохо вызывать ffmpeg N раз, по разу для каждого отрезка?

K>В условиях задачи сказано — за один проход.

на кой делать проход всего файла, если можно сделать пару seek. выглядит, что чувак не адекватен, соответственно и исполнители держаться подальше.
Re[3]: Попинайте меня ещё раз с фрилансерами
От: vsb Казахстан  
Дата: 18.09.23 14:03
Оценка:
Здравствуйте, Kernan, Вы писали:

vsb>>А чем плохо вызывать ffmpeg N раз, по разу для каждого отрезка?

K>В условиях задачи сказано — за один проход.

Я понял, мне просто для общего развития интересно понять, чем обусловлено это требование. Вроде ffmpeg позиционируется на ближайший стоп-кадр за условно O(1), а дальше уже пролистывает кадры. Если не ставить это требование, то задача решается скриптом на баше за несколько часов, который, наверное, топикстартер и сам смог бы написать, раз разбирается в этом немного. А если ставить, то превращается в дни, а то и недели работы со сложно поддерживаемым результатом в виде кода на C или подобном. Видимо я что-то упускаю, вот и интересно понять — что.
Re[4]: Попинайте меня ещё раз с фрилансерами
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 18.09.23 16:40
Оценка:
Здравствуйте, Gt_, Вы писали:

Gt_>на кой делать проход всего файла, если можно сделать пару seek. выглядит, что чувак не адекватен, соответственно и исполнители держаться подальше.


В общем виде seek — это O(N) + декодирование M кадров, где M — это расстояние между соседними ключевыми кадрами.
Re[5]: Попинайте меня ещё раз с фрилансерами
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 18.09.23 17:07
Оценка:
Здравствуйте, Nuzhny, Вы писали:

N>В общем виде seek — это O(N) + декодирование M кадров, где M — это расстояние между соседними ключевыми кадрами.

И это если он не единственный в стриме как частенько бывает.
Sic luceat lux!
Re[4]: Попинайте меня ещё раз с фрилансерами
От: cppguard  
Дата: 18.09.23 21:45
Оценка:
Здравствуйте, prakop, Вы писали:

P>Не виляй. Твои слова: "В ffmpeg есть встроенные средства, чтобы верезать видео по заданным временным меткам, но только для одного отрезка.". ffmpeg позволяет вырезать несколько отрезков. На карту переведёшь или по номеру?

Где ж я виляю? Примы условия игры сперва, что сообщество видело, и можешь сразу публиковать номер карты. Только вот ниже человек с опытом уже написал, что на bash не получится, поэтому ты уже как бы обосрался, но пока только в будущем. Но если не примешь условия игры, то получается, что и не обосрался. Но тогда в другом месте обосрался. Короче, тут и кот шрёдингера, и дилемма вагонетки...
Re[2]: Попинайте меня ещё раз с фрилансерами
От: cppguard  
Дата: 18.09.23 21:48
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>А чем плохо вызывать ffmpeg N раз, по разу для каждого отрезка?


Много видео, мало ресурсов. Кроме того, чтобы точно попасть в кадр, нужно найти ближайший ключевой кадр и от него начать декодирование. Если ключевых кадров мало, а временные метки стоят плотно, то получается совсем не оптимально.
Re[2]: Попинайте меня ещё раз с фрилансерами
От: cppguard  
Дата: 18.09.23 21:48
Оценка:
Здравствуйте, namespace, Вы писали:

N>Для тех, кто не имел дела с видео, выглядит сложно, и непонятно сколько времени займет.


Тем, кто не имел дело с видео, и не стоит отвечать на заказ
Re[5]: Попинайте меня ещё раз с фрилансерами
От: prakop  
Дата: 19.09.23 11:13
Оценка:
>Где ж я виляю?

Прямо тут. Ты написал что в ffmpeg вырезать несколько сегментов за раз невозможно. Это — ложь.

> что на bash не получится


Где я писал что собираюсь что-то делать на bash? Приведи конкретные слова. Плата — это с тебя за мою тебе консультацию по использованию ffmpeg — пришлось гуглить за тебя. Что поделать — капитализм. Так куда переводить удобнее?

> поэтому ты уже как бы обосрался


Обычное хамло. Что ещё можно было ожидать? Думаю, вопросов почему с тобой не стоит иметь дел больше возникать не должно.
Re[6]: Попинайте меня ещё раз с фрилансерами
От: cppguard  
Дата: 19.09.23 12:13
Оценка:
Здравствуйте, prakop, Вы писали:

P>Где я писал что собираюсь что-то делать на bash? Приведи конкретные слова. Плата — это с тебя за мою тебе консультацию по использованию ffmpeg — пришлось гуглить за тебя. Что поделать — капитализм. Так куда переводить удобнее?

Заплачу, как только увижу пример вызова. Кстати, если не bash, то откуда ты команду будешь вызывать? Из домика на дереве?

P>Обычное хамло. Что ещё можно было ожидать? Думаю, вопросов почему с тобой не стоит иметь дел больше возникать не должно.

Тебе однозначно не надо иметь со мной дел.
Re: Попинайте меня ещё раз с фрилансерами
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 14.10.23 14:31
Оценка:
Здравствуйте, cppguard, Вы писали:

C>Что теперь не так?

Смотрю, заказ так и висит. Удалось найти исполнителя или пришлось делать самому?
Sic luceat lux!
Re[2]: Попинайте меня ещё раз с фрилансерами
От: cppguard  
Дата: 15.10.23 09:09
Оценка:
Здравствуйте, Kernan, Вы писали:

C>>Что теперь не так?

K>Смотрю, заказ так и висит. Удалось найти исполнителя или пришлось делать самому?

ChatGPT и вперёд. Написал то, что мне надо где-то за пару часов. Кстати, вспоминал про эту тему, когда читал https://habr.com/en/companies/productivity_inside/articles/679964/.
Re[3]: Попинайте меня ещё раз с фрилансерами
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 15.10.23 13:07
Оценка:
Здравствуйте, cppguard, Вы писали:

C>ChatGPT и вперёд. Написал то, что мне надо где-то за пару часов.

Вот и хорошо. В "пару часов" я не верю и в то, что получилось то, что ты описывал в ТЗ, но раз сделано и устраивает, то это же отлично.
Sic luceat lux!
Re[4]: Попинайте меня ещё раз с фрилансерами
От: cppguard  
Дата: 15.10.23 21:55
Оценка:
Здравствуйте, Kernan, Вы писали:

K>Вот и хорошо. В "пару часов" я не верю и в то, что получилось то, что ты описывал в ТЗ, но раз сделано и устраивает, то это же отлично.

Всё верно. Чистого времени было где-то на час, полчаса я искал телеграм-бота для ChatGPT, и ещё минут 15 оплачивал кредиты для запросов.

K>то, что получилось то, что ты описывал в ТЗ

Сравнивай.

import argparse
import csv
import os

from moviepy.editor import VideoFileClip, concatenate_videoclips

def extract_clips(video_files, csv_file, global_offset):
    clips_list = []

    # Iterate through video files and create clips list
    for file in video_files:
        print(file)
        video_clip = VideoFileClip(file)
        clips_list.append(video_clip)

    # Concatenate video clips
    concatenated_clip = concatenate_videoclips(clips_list)

    # Get total duration of the concatenated clip
    total_duration = concatenated_clip.duration

    # Read the CSV file and extract start and end times
    with open(csv_file, 'r') as file:
        reader = csv.reader(file)
        next(reader)  # Skip the header row

        for row in reader:
            start_time = float(row[1])
            end_time = float(row[2])

            # Apply global offset to each start-end pair
            start_time += global_offset
            end_time += global_offset

            # Sanitize start and end time values
            start_time = max(0, min(start_time, total_duration))
            end_time = max(start_time, min(end_time, total_duration))

            duration = end_time - start_time

            print(start_time, end_time)
            subclip = concatenated_clip.subclip(start_time, end_time)

            # Infer output file name based on start time and duration
            output_file = f"clip_{start_time}_{duration}.mp4"
            # Write the subclip to the output file
            subclip.write_videofile(output_file, codec="libx264", audio_codec="aac", temp_audiofile="temp-audio.m4a", remove_temp=True)

def main():
    parser = argparse.ArgumentParser(description='Video Clip Extractor')
    parser.add_argument('--time-file', metavar='time_file', type=str, required=True, help='path to the CSV file')
    parser.add_argument('--time-offset', metavar='offset', type=float, default=0.0, help='global time offset')
    parser.add_argument('directory', metavar='directory', type=str, help='path to the input directory')

    args = parser.parse_args()
    # Get the video files in the specified directory.
    video_files = [os.path.join(args.directory, file) for file in os.listdir(args.directory)
                   if file.endswith(('.mp4', '.avi', '.mkv'))]
    video_files.sort()

    extract_clips(video_files, args.time_file, args.time_offset)

if __name__ == '__main__':
    main()
Re[6]: Попинайте меня ещё раз с фрилансерами
От: cppguard  
Дата: 16.10.23 01:16
Оценка:
Здравствуйте, reversecode, Вы писали:

R>а по условиям задачи оно не должно было форкать ffmpeg который якобы нужным функционалом не обладал


...
В ffmpeg есть встроенные средства, чтобы верезать видео по заданным временным меткам, но только для одного отрезка. Данная работа предполагает, что программа будет за одни проход по исходному видео вырезать все отрезки.


Вся суть кывта — поймут по-своему, потом обосрут в комментах. Я не конкретно про слова выше, а в целом про проблему. Да даже без контекста — предположить, что я ищу фрилансеров, чтобы написать ffmpeg с нуля это... странное предположение =) Я лишь хотел избежать ситуации, когда мне скинут однострочник на bash и попросят свои кровные, а тем временем однострочник будет вырезать видео без поиска ближайшего ключевого кадра, что совсем не годится для моих нужд.
Re[8]: Попинайте меня ещё раз с фрилансерами
От: cppguard  
Дата: 16.10.23 02:05
Оценка:
Здравствуйте, reversecode, Вы писали:

R>давайте я возьму дерзость и выскажусь за всех флиралсеров ктыва и тем кто к вам возможно еще отзывался на вак на хабре

R>

R>Вот уже один предложил написать скрипт на Ruby (почему не Bash, Карл?) и дёргать ffmpeg

R>они(и я) поняли вас так что
R>ffmpeg не обладает нужным функционалом
R>и какие то говно скрипты итд вы не хотите
R>значит нужно было лезть в ffmpeg и через api
R>писать свое решение которое бы цепляло ffmpeg как либу

Так всё хорошо, мы с ним общались. Просто в процессе разговора с ним и другими фрилансерами, я вдруг понял, что мне быстрее будет снова позвать ЧатГПТ В альтернативной реальности кто-то из них написал бы мне примерно такой же скрипт, только за бОльшие деньги, чем я потратил на кредиты для бота.
Re[6]: Попинайте меня ещё раз с фрилансерами
От: cppguard  
Дата: 16.10.23 02:15
Оценка:
Здравствуйте, DiPaolo, Вы писали:

DP>Ну ровно как и в прошлый раз: ключевое и самое трудозатратное требование ТЗ не выполнено


DP>1. В ТЗ:

DP>

DP>- В ffmpeg есть встроенные средства, чтобы верезать видео по заданным временным меткам, но только для одного отрезка. Данная работа предполагает, что программа будет за одни проход по исходному видео вырезать все отрезки.


DP>У вас FFmpeg запускается отдельно для каждого отрезка. Такого по условию быть не должно. И выше в треде вы с упорством доказывали, что FFmpeg не подходит и такое не умеет, когда вам предлагали абсолютно такое же решение.

Вероятно, произошла путаница между ffmpeg и libffmpeg. От последнего я не отказывался. А бинарник умеет только по-тупому вытягивать отрезок видео.

DP>2. Кроме того, временные метки не читаются из имени файла, как заявлено в задании:

DP>

DP>- В директории с результатом должны быть отрезки видео из общего архива за день (одна из папок YYYYMMDD), соответствующие временным меткам из файла .CSV.


DP>У вас это передается как параметр в скрипт.

И что? Я сам для себя изменил требование в процессе разработки. Этой ничтожный пункт, который никак не влияет на сложность задания.

DP>3. Еще одно требование звучало совсем иначе в ТЗ, и, ИМХО, не выполнено:

DP>

DP>- Временной отрезок может включать конец одного исходного видео и начало другого. Программа должна корректно это обрабатывать.

DP>Ну тут мы просто проверяем не выход за границы. По условию это выглядело скорее, что пересечение попадет и в первый, и во второй выходные клипы.

Ну вот, теперь ещё нужно разжёвывать, как код работает Извините, я на такое не подписывался. Опубликованная программа делает ровно то, что я описал, в том числе и правильное вырезание клипа, если временной отрезок охватывает больше одного исходного видео.
Re[7]: Попинайте меня ещё раз с фрилансерами
От: so5team https://stiffstream.com
Дата: 16.10.23 05:24
Оценка:
Здравствуйте, cppguard, Вы писали:

DP>>У вас FFmpeg запускается отдельно для каждого отрезка. Такого по условию быть не должно. И выше в треде вы с упорством доказывали, что FFmpeg не подходит и такое не умеет, когда вам предлагали абсолютно такое же решение.

C>Вероятно, произошла путаница между ffmpeg и libffmpeg. От последнего я не отказывался. А бинарник умеет только по-тупому вытягивать отрезок видео.

А разве libffmpeg где-то существует? Вроде бы в FFMPEG-n4.* и FFMPEG-n5.* есть отдельные библиотеки libavcodec, libavdevice, libavformat, libavfilter, libswscale и т.д.
Re[8]: Попинайте меня ещё раз с фрилансерами
От: DiPaolo Россия  
Дата: 16.10.23 08:08
Оценка:
S>Из вашего описания у меня лично (а может и не у меня одного?) сложилось впечатление, что если в csv файле задано что-то вроде:
Так и есть. +1
Патриот здравого смысла
Re[6]: Попинайте меня ещё раз с фрилансерами
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 16.10.23 08:42
Оценка:
Здравствуйте, DiPaolo, Вы писали:

DP>Ну ровно как и в прошлый раз: ключевое и самое трудозатратное требование ТЗ не выполнено

Я вообще думал что задача разбивается на две. Первое, построить деревом временных отрезков по его структуре директорий и названиям файлов; второе, пройти по нему и соединить (честно, не помню точную формулировку, а перечитывать лень) всё в файлы корректным способом через ffmpeg. Вывести ошибки слияния файлов и инфу о временных дырках — опционально.
Sic luceat lux!
Re[8]: Попинайте меня ещё раз с фрилансерами
От: cppguard  
Дата: 16.10.23 18:42
Оценка:
Здравствуйте, so5team, Вы писали:

S>А разве libffmpeg где-то существует? Вроде бы в FFMPEG-n4.* и FFMPEG-n5.* есть отдельные библиотеки libavcodec, libavdevice, libavformat, libavfilter, libswscale и т.д.


Я условно выразился. С этим ffmpeg такая путаница, ещё со времён, когда libav от них форкнулся.
Re[9]: Попинайте меня ещё раз с фрилансерами
От: so5team https://stiffstream.com
Дата: 16.10.23 19:26
Оценка:
Здравствуйте, cppguard, Вы писали:

S>>Или же что исходное условие было сформулировано так, что трактуется неоднозначно.


C>Нет, всё не так. Для примера выше должно быть три выходных файла. Разные отрезки логически между собой никак не связаны.


Так а как тогда должно интерпретироваться вот это условие:

Временной отрезок может включать конец одного исходного видео и начало другого. Программа должна корректно это обрабатывать.

?

Типа конец файла A.mp4 объединять с началом файла B.mp4 в один клип если это необходимо?

Или если достигнут конец файла A.mp4, то текущий клип нужно завершать, а начало файла B.mp4 сбрасывать уже в следующий клип?
Re[10]: Попинайте меня ещё раз с фрилансерами
От: cppguard  
Дата: 16.10.23 23:19
Оценка:
Здравствуйте, so5team, Вы писали:

S>Типа конец файла A.mp4 объединять с началом файла B.mp4 в один клип если это необходимо?


Именно так. А как ещё можно понять это требование? Есть регистратор, он непрерывно пишет порциями по N минут, нам интересно вытащить клип в на отрезке времени [a, b]. Очевидно, что этот отрезок может попадать на стык двух порций.
Re[10]: Попинайте меня ещё раз с фрилансерами
От: cppguard  
Дата: 17.10.23 02:02
Оценка:
Здравствуйте, DiPaolo, Вы писали:

DP>Еще как принципиально. Этот "нюанс" все меняет в корне дела. Более того, вы сами с упорством всем тут доказывали, что так как вы в итоге сделали — делать ни в коем случае нельзя. А потом: фиииии, вот дурачки, можно же было простым образом за два часа сделать. Ну так вам и предлагали с самого начала такое решение.


В ffmpeg есть ключик "-s" (кажется, лень проверять), который тупо копирует кусок видео по заданному временному отрезку. Не декодирует, а именно копирует. Я не знаю, зачем этот режим вообще добавили, но минус такого решения — если временной отрезок попадает между двух ключевых кадров, то кусок видео до ключевого кадра от начала вырезанного клипа будет "жёванным". И именно это решение находится на первой странице поиска гугла. Поэтому я предположил, что потенциальные исполнители перед тем, как сделать отклик, загуглять "ffmpeg extract segment", увидят вот этот хромой способ и подумают, что это лёгкие деньги. И хотел как-то донести, что меня этот способ не устраивает. Вероятно, правильно было бы таки расписать подробно, что такой ключ в программе есть, но пользоваться им нельзя. Так что да — с вашей стороны выглядит, словно я поменял ТЗ на ходу, с моей стороны — способ уберечься от проходимцев.
Re[12]: Попинайте меня ещё раз с фрилансерами
От: aik Австралия  
Дата: 17.10.23 04:11
Оценка:
Здравствуйте, DiPaolo, Вы писали:

DP>Все попереврали.

DP>- параметр -ss все вырезает как надо:

Кстати можно ещё и как то так — я поленился отладить, результат неверный, но идея такая что фильтрами можно наворотить что там ТС хотел:

ffmpeg -y -i PXL_20230611_011746852.mp4 \
 -filter_complex "[0:v]trim=start=5:end=10,setpts=PTS-STARTPTS,split[v1]; [0:v]trim=start=22:end=25,setpts=PTS-STARTPTS,split[v2]; [v1][v2]concat[vo]" \
 -map "[vo]" new.mp4


Но я был уверен что нужно без транскодинга (пример выше транскодит), если нужно просто вырезать кусок, то естественно хочется чтоб быстро работало %)
Re[11]: Попинайте меня ещё раз с фрилансерами
От: so5team https://stiffstream.com
Дата: 17.10.23 04:45
Оценка:
Здравствуйте, cppguard, Вы писали:

S>>Типа конец файла A.mp4 объединять с началом файла B.mp4 в один клип если это необходимо?


C>Именно так. А как ещё можно понять это требование?


Вам тут уже озвучили три интерпретации ваших слов:

— если под "конец одного исходного видео и начало другого" понимаются именно исходные файлы с регистратора, то:

a) корректным может быть обрезание клипа при окончании файла A.mp4 и начало нового клипа, куда будут записываться данные из начала B.mp4;
b) корректным может быть включение в клип окончания файла A.mp4 и начало файла B.mp4.

Некорректной же обработкой будет, например, продолжение клипа при окончании файла A.mp4, но "добивание" его пустотой (т.е. черный фон для видео и тишина для аудио).

— если под "конец одного исходного видео и начало другого" понимаются результирующие файлы-клипы (а так тоже можно воспринять ваши слова), то при наличии пересечений в отрезках формировать меньше клипов, объединяя пересекающиеся отрезки в один клип. Или даже делать больше клипов формируя их так, чтобы пересечений не было вообще.

C>Есть регистратор, он непрерывно пишет порциями по N минут, нам интересно вытащить клип в на отрезке времени [a, b]. Очевидно, что этот отрезок может попадать на стык двух порций.


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

Это и при очном общении, когда задача выдается устно и видна реакция исполнителя, проявляется.
А уж в письменном-то виде, так вообще сплошь и рядом.

И для меня загадка почему вместо фразы:

Временной отрезок может включать конец одного исходного видео и начало другого. Программа должна корректно это обрабатывать.

вы не написали что-то вроде:

Во временной отрезок может попадать конец одного исходного видео-файла и начало следующего видео-файла. В этом случае должен быть сформирован клип, содержащий видео фрагменты из обоих файлов.


Причем тут еще бы нужно озвучить поведение при:

— попадании такой ситуации на границу суток (нужно ли брать следующий файл из каталога с видео записями следующего дня);
— отсутствия следующего файла;
— ситуации, когда в следующем файле параметры видео/аудио не совпадают с текущим файлом (например, текущий файл был видео HD-качества и аудио 16bit/44.1kHz, следующий файл оказался с видео FullHD и аудио 24bit/48kHz). Скорее всего такого быть не должно, но автору нужно понимать граничные условия.
Re[13]: Попинайте меня ещё раз с фрилансерами
От: IID Россия  
Дата: 19.10.23 06:23
Оценка:
Здравствуйте, cppguard, Вы писали:

C>Я задался целью выяснить, почему я с полпинка не могу найти фрилансеров. Считаю, что примерно выяснил, почему.


Озвучьте же это знание!
kalsarikännit
Re[14]: Попинайте меня ещё раз с фрилансерами
От: cppguard  
Дата: 19.10.23 21:47
Оценка:
Здравствуйте, IID, Вы писали:

IID>Озвучьте же это знание!


В 2012-ом, когда я впервые вышел на фриланс, рынок был другим. Я сам выяснял, что нужно заказчику, и предлагал возможные варианты решений. Сейчас, чтобы не вылететь в трубу и не платить сотни тысяч, за простенький скрипт, заказчику требуется основательно подойти к описанию ТЗ. Но это только догадки. Вероятно, что на международном рынке фриланса всё так же можно за недорого найти исполнителя, который сам по словесному описанию составит ТЗ и быстро всё сделает, но для этого нужно мутить с виртуальной валютной картой. Пока что ChatGPT является приемлемой альтернативой.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.