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

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

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


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

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


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

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


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


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


в общем случае seek это seek, а не вычитка всего файла. читать весь файл просто глупо.
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[5]: Попинайте меня ещё раз с фрилансерами
От: reversecode google
Дата: 15.10.23 22:08
Оценка: 2 (1) +1 :)
так оно в своей основе запускает ffmpeg
а по условиям задачи оно не должно было форкать ffmpeg который якобы нужным функционалом не обладал
Re[6]: Попинайте меня ещё раз с фрилансерами
От: cppguard  
Дата: 16.10.23 01:16
Оценка:
Здравствуйте, reversecode, Вы писали:

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


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


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

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

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

где у вас произошел разрыв в понимании предлагаю разобраться самому
на будущее пригодиться
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[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[7]: Попинайте меня ещё раз с фрилансерами
От: DiPaolo Россия  
Дата: 16.10.23 07:26
Оценка: +3
Судя по вашему ответу могу сказать одно: смысла в следующий раз приходить плакаться на форум, какие все вокруг дураки, нет. Потому что вы не воспринимаете обратную связь: ни в прошлый раз, ни сейчас.
Патриот здравого смысла
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]: Попинайте меня ещё раз с фрилансерами
От: 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: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[8]: Попинайте меня ещё раз с фрилансерами
От: cppguard  
Дата: 16.10.23 18:42
Оценка:
Здравствуйте, so5team, Вы писали:

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


Я условно выразился. С этим ffmpeg такая путаница, ещё со времён, когда libav от них форкнулся.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.