Что теперь не так? Бюджет — любой, просто назовите сумму. Всего 3 пункта в ТЗ. Из 13 откликов — 3 более-менее адекватных, но только один чётко ответил по стоимости, сроками и зависимостям. Если есть свободное время, то милости прошу меня убедить в том, что я снова ставлю невыполнимую задачу. Моё мнение остаётся неизменным — адекватных исполнителей не осталось. Хотите организовать стартап, не ввалив миллионы ещё на этапе протитипирования? — Учитесь программировать. По прошествии трёх дней попробую нанять парочку исполнителей и отпишусь о результате.
P.S. Вот уже один предложил написать скрипт на Ruby (почему не Bash, Карл?) и дёргать ffmpeg. Видимо, я недостаточно внятно написал, что ffmpeg не умеет нужную функцию из коробки.
Здравствуйте, prakop, Вы писали:
P>Первая же ссылка в гугле на SO говорит об обратном. Очевидно, что с таким заказчиком-экспертом себе же дороже работать выйдет.
Ох, началось Ну так напиши обёртку на bash, которая вызывает ffmpeg для моей задачи, я тебе 50 000 заплачу. А если окажется, что я прав — ты мне 25 000, идёт?
C>Ох, началось Ну так напиши обёртку на bash, которая вызывает ffmpeg для моей задачи, я тебе 50 000 заплачу. А если окажется, что я прав — ты мне 25 000, идёт?
Не виляй. Твои слова: "В ffmpeg есть встроенные средства, чтобы верезать видео по заданным временным меткам, но только для одного отрезка.". ffmpeg позволяет вырезать несколько отрезков. На карту переведёшь или по номеру?
C>Что теперь не так?
Для тех, кто не имел дела с видео, выглядит сложно, и непонятно сколько времени займет.
Напиши проще, что нужно залезть в исходники ffmpeg и допилить под твои требования.
Дописать новую функцию с параметрами: xxx, yyy, zzz
Здравствуйте, namespace, Вы писали:
N>Напиши проще, что нужно залезть в исходники ffmpeg и допилить под твои требования.
Там не надо лазать даже, задача простая, пишется примерно за вечер на С++ или Питоне. На баше может не получиться попасть в точное время для потокового кодека и редкими ключевыми кадрами.
Здравствуйте, cppguard, Вы писали:
C>P.S. Вот уже один предложил написать скрипт на Ruby (почему не Bash, Карл?) и дёргать ffmpeg. Видимо, я недостаточно внятно написал, что ffmpeg не умеет нужную функцию из коробки.
Недели две, Go + libffmpeg, сделаю автодетект входных форматов (и не буду парить моск, если там окажутся файлы в разных форматах), но выходной формат должен как-то задаваться. Дам пожизненную гарантию на исправление своих ошибок. 500К руб. Через хабр отвечать лень, ты все равно не захочешь столько платить.
P.S. А что делать, если во входных файлах нет заказанного интервала? Ругаццо матерно или гнать "настроечную таблицу"? А если он есть, но не совсем?
P.P.S. Формат UNIX timestamp следует уточнить. RFC-3339? Но это уже мелочи и детали, впрочем.
Здравствуйте, cppguard, Вы писали:
C>Что теперь не так?
Да всё так. Опять те же мутные формулировки. Нарисовал бы картинку что ли. Зачем-то приплёл "Сортировка файлов по имени совпадает с сортировкой файлов в хронологическом порядке". Зачем это нужно? Для кого? Мне не очевидно, что подаётся на вход программы кроме директории куда надо сохранить отрезки и что собственно резать, граничные условия и т.п. Задачу в общем случае не решить без транскодинга и тут открывается портал вопросов... Предположим, я знаю ffmpeg и работаю по ставке ну пусть будет 40$ в час. Задачку оценю часов на 20-40 включая все твои хотелки которые нифига не понятны из описания, а значит ты будешь совокуплять мне мозг. C>- В ffmpeg есть встроенные средства, чтобы верезать видео по заданным временным меткам
Не надо писать что есть, а чего нет. Пиши что тебе надо и всё, люди сами знают и скажут тебе как проще сделать, а ты можешь сказать что это тебе не подходит. Хуже всего, это заказчики которые что-то там посмотрели и УЖ ТОЧНО знают как оно на самом деле работает. Если знаешь — делай сам, только мы вот видели как ты сделал по своей же формулировке.
Здравствуйте, Kernan, Вы писали:
K>Здравствуйте, vsb, Вы писали:
vsb>>А чем плохо вызывать ffmpeg N раз, по разу для каждого отрезка? K>В условиях задачи сказано — за один проход.
на кой делать проход всего файла, если можно сделать пару seek. выглядит, что чувак не адекватен, соответственно и исполнители держаться подальше.
Здравствуйте, Kernan, Вы писали:
vsb>>А чем плохо вызывать ffmpeg N раз, по разу для каждого отрезка? K>В условиях задачи сказано — за один проход.
Я понял, мне просто для общего развития интересно понять, чем обусловлено это требование. Вроде ffmpeg позиционируется на ближайший стоп-кадр за условно O(1), а дальше уже пролистывает кадры. Если не ставить это требование, то задача решается скриптом на баше за несколько часов, который, наверное, топикстартер и сам смог бы написать, раз разбирается в этом немного. А если ставить, то превращается в дни, а то и недели работы со сложно поддерживаемым результатом в виде кода на C или подобном. Видимо я что-то упускаю, вот и интересно понять — что.
Здравствуйте, Gt_, Вы писали:
Gt_>на кой делать проход всего файла, если можно сделать пару seek. выглядит, что чувак не адекватен, соответственно и исполнители держаться подальше.
В общем виде seek — это O(N) + декодирование M кадров, где M — это расстояние между соседними ключевыми кадрами.
Здравствуйте, vsb, Вы писали:
vsb>Я понял, мне просто для общего развития интересно понять, чем обусловлено это требование. Вроде ffmpeg позиционируется на ближайший стоп-кадр за условно O(1), а дальше уже пролистывает кадры.
Вроде как всё не так просто. Посмотри, как оно делается: вот
Здравствуйте, Nuzhny, Вы писали:
N>В общем виде seek — это O(N) + декодирование M кадров, где M — это расстояние между соседними ключевыми кадрами.
И это если он не единственный в стриме как частенько бывает.
Здравствуйте, prakop, Вы писали:
P>Не виляй. Твои слова: "В ffmpeg есть встроенные средства, чтобы верезать видео по заданным временным меткам, но только для одного отрезка.". ffmpeg позволяет вырезать несколько отрезков. На карту переведёшь или по номеру?
Где ж я виляю? Примы условия игры сперва, что сообщество видело, и можешь сразу публиковать номер карты. Только вот ниже человек с опытом уже написал, что на bash не получится, поэтому ты уже как бы обосрался, но пока только в будущем. Но если не примешь условия игры, то получается, что и не обосрался. Но тогда в другом месте обосрался. Короче, тут и кот шрёдингера, и дилемма вагонетки...
Здравствуйте, vsb, Вы писали:
vsb>А чем плохо вызывать ffmpeg N раз, по разу для каждого отрезка?
Много видео, мало ресурсов. Кроме того, чтобы точно попасть в кадр, нужно найти ближайший ключевой кадр и от него начать декодирование. Если ключевых кадров мало, а временные метки стоят плотно, то получается совсем не оптимально.
Прямо тут. Ты написал что в ffmpeg вырезать несколько сегментов за раз невозможно. Это — ложь.
> что на bash не получится
Где я писал что собираюсь что-то делать на bash? Приведи конкретные слова. Плата — это с тебя за мою тебе консультацию по использованию ffmpeg — пришлось гуглить за тебя. Что поделать — капитализм. Так куда переводить удобнее?
> поэтому ты уже как бы обосрался
Обычное хамло. Что ещё можно было ожидать? Думаю, вопросов почему с тобой не стоит иметь дел больше возникать не должно.
Здравствуйте, Nuzhny, Вы писали:
N>Здравствуйте, Gt_, Вы писали:
Gt_>>на кой делать проход всего файла, если можно сделать пару seek. выглядит, что чувак не адекватен, соответственно и исполнители держаться подальше.
N>В общем виде seek — это O(N) + декодирование M кадров, где M — это расстояние между соседними ключевыми кадрами.
в общем случае seek это seek, а не вычитка всего файла. читать весь файл просто глупо.
Здравствуйте, prakop, Вы писали:
P>Где я писал что собираюсь что-то делать на bash? Приведи конкретные слова. Плата — это с тебя за мою тебе консультацию по использованию ffmpeg — пришлось гуглить за тебя. Что поделать — капитализм. Так куда переводить удобнее?
Заплачу, как только увижу пример вызова. Кстати, если не bash, то откуда ты команду будешь вызывать? Из домика на дереве?
P>Обычное хамло. Что ещё можно было ожидать? Думаю, вопросов почему с тобой не стоит иметь дел больше возникать не должно.
Тебе однозначно не надо иметь со мной дел.
Здравствуйте, cppguard, Вы писали:
C>ChatGPT и вперёд. Написал то, что мне надо где-то за пару часов.
Вот и хорошо. В "пару часов" я не верю и в то, что получилось то, что ты описывал в ТЗ, но раз сделано и устраивает, то это же отлично.
Здравствуйте, 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 listfor 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 rowfor 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()
Здравствуйте, reversecode, Вы писали:
R>а по условиям задачи оно не должно было форкать ffmpeg который якобы нужным функционалом не обладал
...
В ffmpeg есть встроенные средства, чтобы верезать видео по заданным временным меткам, но только для одного отрезка. Данная работа предполагает, что программа будет за одни проход по исходному видео вырезать все отрезки.
Вся суть кывта — поймут по-своему, потом обосрут в комментах. Я не конкретно про слова выше, а в целом про проблему. Да даже без контекста — предположить, что я ищу фрилансеров, чтобы написать ffmpeg с нуля это... странное предположение =) Я лишь хотел избежать ситуации, когда мне скинут однострочник на bash и попросят свои кровные, а тем временем однострочник будет вырезать видео без поиска ближайшего ключевого кадра, что совсем не годится для моих нужд.
давайте я возьму дерзость и выскажусь за всех флиралсеров ктыва и тем кто к вам возможно еще отзывался на вак на хабре
Вот уже один предложил написать скрипт на Ruby (почему не Bash, Карл?) и дёргать ffmpeg
они(и я) поняли вас так что
ffmpeg не обладает нужным функционалом
и какие то говно скрипты итд вы не хотите
значит нужно было лезть в ffmpeg и через api
писать свое решение которое бы цепляло ffmpeg как либу
где у вас произошел разрыв в понимании предлагаю разобраться самому
на будущее пригодиться
Ну ровно как и в прошлый раз: ключевое и самое трудозатратное требование ТЗ не выполнено
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
Ну тут мы просто проверяем не выход за границы. По условию это выглядело скорее, что пересечение попадет и в первый, и во второй выходные клипы.
Здравствуйте, reversecode, Вы писали:
R>давайте я возьму дерзость и выскажусь за всех флиралсеров ктыва и тем кто к вам возможно еще отзывался на вак на хабре R>
R>Вот уже один предложил написать скрипт на Ruby (почему не Bash, Карл?) и дёргать ffmpeg
R>они(и я) поняли вас так что R>ffmpeg не обладает нужным функционалом R>и какие то говно скрипты итд вы не хотите R>значит нужно было лезть в ffmpeg и через api R>писать свое решение которое бы цепляло ffmpeg как либу
Так всё хорошо, мы с ним общались. Просто в процессе разговора с ним и другими фрилансерами, я вдруг понял, что мне быстрее будет снова позвать ЧатГПТ В альтернативной реальности кто-то из них написал бы мне примерно такой же скрипт, только за бОльшие деньги, чем я потратил на кредиты для бота.
Здравствуйте, DiPaolo, Вы писали:
DP>Ну ровно как и в прошлый раз: ключевое и самое трудозатратное требование ТЗ не выполнено
DP>1. В ТЗ: DP>
DP>- В ffmpeg есть встроенные средства, чтобы верезать видео по заданным временным меткам, но только для одного отрезка. Данная работа предполагает, что программа будет за одни проход по исходному видео вырезать все отрезки.
DP>У вас FFmpeg запускается отдельно для каждого отрезка. Такого по условию быть не должно. И выше в треде вы с упорством доказывали, что FFmpeg не подходит и такое не умеет, когда вам предлагали абсолютно такое же решение.
Вероятно, произошла путаница между ffmpeg и libffmpeg. От последнего я не отказывался. А бинарник умеет только по-тупому вытягивать отрезок видео.
DP>2. Кроме того, временные метки не читаются из имени файла, как заявлено в задании: DP>
DP>- В директории с результатом должны быть отрезки видео из общего архива за день (одна из папок YYYYMMDD), соответствующие временным меткам из файла .CSV.
DP>У вас это передается как параметр в скрипт.
И что? Я сам для себя изменил требование в процессе разработки. Этой ничтожный пункт, который никак не влияет на сложность задания.
DP>3. Еще одно требование звучало совсем иначе в ТЗ, и, ИМХО, не выполнено: DP>
DP>- Временной отрезок может включать конец одного исходного видео и начало другого. Программа должна корректно это обрабатывать.
DP>Ну тут мы просто проверяем не выход за границы. По условию это выглядело скорее, что пересечение попадет и в первый, и во второй выходные клипы.
Ну вот, теперь ещё нужно разжёвывать, как код работает Извините, я на такое не подписывался. Опубликованная программа делает ровно то, что я описал, в том числе и правильное вырезание клипа, если временной отрезок охватывает больше одного исходного видео.
Здравствуйте, cppguard, Вы писали:
DP>>У вас FFmpeg запускается отдельно для каждого отрезка. Такого по условию быть не должно. И выше в треде вы с упорством доказывали, что FFmpeg не подходит и такое не умеет, когда вам предлагали абсолютно такое же решение. C>Вероятно, произошла путаница между ffmpeg и libffmpeg. От последнего я не отказывался. А бинарник умеет только по-тупому вытягивать отрезок видео.
А разве libffmpeg где-то существует? Вроде бы в FFMPEG-n4.* и FFMPEG-n5.* есть отдельные библиотеки libavcodec, libavdevice, libavformat, libavfilter, libswscale и т.д.
Судя по вашему ответу могу сказать одно: смысла в следующий раз приходить плакаться на форум, какие все вокруг дураки, нет. Потому что вы не воспринимаете обратную связь: ни в прошлый раз, ни сейчас.
Здравствуйте, 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-файла... Но, есть ощущение, что там этого нет вообще.
Или же что исходное условие было сформулировано так, что трактуется неоднозначно.
Здравствуйте, DiPaolo, Вы писали:
DP>Ну ровно как и в прошлый раз: ключевое и самое трудозатратное требование ТЗ не выполнено
Я вообще думал что задача разбивается на две. Первое, построить деревом временных отрезков по его структуре директорий и названиям файлов; второе, пройти по нему и соединить (честно, не помню точную формулировку, а перечитывать лень) всё в файлы корректным способом через ffmpeg. Вывести ошибки слияния файлов и инфу о временных дырках — опционально.
Здравствуйте, 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>Или же что исходное условие было сформулировано так, что трактуется неоднозначно.
Нет, всё не так. Для примера выше должно быть три выходных файла. Разные отрезки логически между собой никак не связаны.
Здравствуйте, so5team, Вы писали:
S>А разве libffmpeg где-то существует? Вроде бы в FFMPEG-n4.* и FFMPEG-n5.* есть отдельные библиотеки libavcodec, libavdevice, libavformat, libavfilter, libswscale и т.д.
Я условно выразился. С этим ffmpeg такая путаница, ещё со времён, когда libav от них форкнулся.
Здравствуйте, cppguard, Вы писали:
S>>Или же что исходное условие было сформулировано так, что трактуется неоднозначно.
C>Нет, всё не так. Для примера выше должно быть три выходных файла. Разные отрезки логически между собой никак не связаны.
Так а как тогда должно интерпретироваться вот это условие:
Временной отрезок может включать конец одного исходного видео и начало другого. Программа должна корректно это обрабатывать.
?
Типа конец файла A.mp4 объединять с началом файла B.mp4 в один клип если это необходимо?
Или если достигнут конец файла A.mp4, то текущий клип нужно завершать, а начало файла B.mp4 сбрасывать уже в следующий клип?
Здравствуйте, so5team, Вы писали:
S>Типа конец файла A.mp4 объединять с началом файла B.mp4 в один клип если это необходимо?
Именно так. А как ещё можно понять это требование? Есть регистратор, он непрерывно пишет порциями по N минут, нам интересно вытащить клип в на отрезке времени [a, b]. Очевидно, что этот отрезок может попадать на стык двух порций.
S>>Тем не менее, выбранная вами для работы moviepy делает именно это -- запускает бинарник ffmpeg и читает бинарные данные с его стандартного вывода (формирование командной строки, запуск, чтение). C>Отлично, это непринципиально. Главное, что идёт правильное декодирование видео, а не просто вырезается кусок данных.
Еще как принципиально. Этот "нюанс" все меняет в корне дела. Более того, вы сами с упорством всем тут доказывали, что так как вы в итоге сделали — делать ни в коем случае нельзя. А потом: фиииии, вот дурачки, можно же было простым образом за два часа сделать. Ну так вам и предлагали с самого начала такое решение.
Здравствуйте, DiPaolo, Вы писали:
DP>Еще как принципиально. Этот "нюанс" все меняет в корне дела. Более того, вы сами с упорством всем тут доказывали, что так как вы в итоге сделали — делать ни в коем случае нельзя. А потом: фиииии, вот дурачки, можно же было простым образом за два часа сделать. Ну так вам и предлагали с самого начала такое решение.
В ffmpeg есть ключик "-s" (кажется, лень проверять), который тупо копирует кусок видео по заданному временному отрезку. Не декодирует, а именно копирует. Я не знаю, зачем этот режим вообще добавили, но минус такого решения — если временной отрезок попадает между двух ключевых кадров, то кусок видео до ключевого кадра от начала вырезанного клипа будет "жёванным". И именно это решение находится на первой странице поиска гугла. Поэтому я предположил, что потенциальные исполнители перед тем, как сделать отклик, загуглять "ffmpeg extract segment", увидят вот этот хромой способ и подумают, что это лёгкие деньги. И хотел как-то донести, что меня этот способ не устраивает. Вероятно, правильно было бы таки расписать подробно, что такой ключ в программе есть, но пользоваться им нельзя. Так что да — с вашей стороны выглядит, словно я поменял ТЗ на ходу, с моей стороны — способ уберечься от проходимцев.
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)
Вы же за фидбэком сюда пришли. Вам уже несколько человек сказали, как ваше задание и поведение выглядит со стороны для других людей. Может уже стоит признать, что ваше задание было непонтяным для других, а не зарываться все глубже в отмазки? Выглядит смешно и непрофессионально.
Чтобы подобных казусов не было, рекомендую вам просто писать ЧТО вы хотите, а не КАК вам надо сделать. Ну просто не выежываться, а написать как клиент. А если уж сами все понимаете — ну так делайте сами и мозги никому не грейте.
– Степан, у гостя карета сломалась…
– Вижу, барин. Ось полетела, да спицы менять надо.
– Починить сможешь?
– За день сделаю.
– А за два? Степан глянул на барина, перевел взгляд на карету:
– Можно и за два.
– А за пять?. Степан задумчиво почесал в затылке:
– Трудновато, барин. Но ежели постараться, можно и за пять…
– А за десять дней? Степан аж крякнул:
– Ну, барин, тут тогда самому не справиться. Помощник нужен. Хомо сапиенс!
Здравствуйте, 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). Скорее всего такого быть не должно, но автору нужно понимать граничные условия.
Здравствуйте, DiPaolo, Вы писали:
DP>Все попереврали.
stream copying <- вот об этом я говорил. Это мне НЕ нужно было.
DP>Вы же за фидбэком сюда пришли. Вам уже несколько человек сказали, как ваше задание и поведение выглядит со стороны для других людей. Может уже стоит признать, что ваше задание было непонтяным для других, а не зарываться все глубже в отмазки? Выглядит смешно и непрофессионально.
Возможно. Но я не вижу, что я где-то отмазываюсь? От чего вообще тут можно отмазываться? Я никого не обвиняю, меня никто не обвиняет (кроме тупых набросов). Я задался целью выяснить, почему я с полпинка не могу найти фрилансеров. Считаю, что примерно выяснил, почему.
DP>Чтобы подобных казусов не было, рекомендую вам просто писать ЧТО вы хотите, а не КАК вам надо сделать. Ну просто не выежываться, а написать как клиент. А если уж сами все понимаете — ну так делайте сами и мозги никому не грейте.
Здравствуйте, IID, Вы писали:
IID>Озвучьте же это знание!
В 2012-ом, когда я впервые вышел на фриланс, рынок был другим. Я сам выяснял, что нужно заказчику, и предлагал возможные варианты решений. Сейчас, чтобы не вылететь в трубу и не платить сотни тысяч, за простенький скрипт, заказчику требуется основательно подойти к описанию ТЗ. Но это только догадки. Вероятно, что на международном рынке фриланса всё так же можно за недорого найти исполнителя, который сам по словесному описанию составит ТЗ и быстро всё сделает, но для этого нужно мутить с виртуальной валютной картой. Пока что ChatGPT является приемлемой альтернативой.
Здравствуйте, cppguard, Вы писали:
C>В 2012-ом, когда я впервые вышел на фриланс, рынок был другим. Я сам выяснял, что нужно заказчику, и предлагал возможные варианты решений. Сейчас, чтобы не вылететь в трубу и не платить сотни тысяч, за простенький скрипт, заказчику требуется основательно подойти к описанию ТЗ. Но это только догадки. Вероятно, что на международном рынке фриланса всё так же можно за недорого найти исполнителя, который сам по словесному описанию составит ТЗ и быстро всё сделает, но для этого нужно мутить с виртуальной валютной картой. Пока что ChatGPT является приемлемой альтернативой.
Ничего ты так и не понял...