Прямо тут. Ты написал что в 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 от них форкнулся.