#python #loops #ffmpeg #directory #google-colaboratory
#python #циклы #ffmpeg #каталог #google-colaboratory
Вопрос:
я создал Google colab для кодирования своих видео, но на самом деле я могу создавать файлы только по одному. Я хочу закодировать все видеофайлы из одной папки.
Я пробовал это, но, похоже, не работает
import os
DIRECTORY= '/content/drive/My Drive/Videos'
for filename in os.listdir(DIRECTORY):
if (filename.endswith(".mov")): #or .avi, .mpeg, whatever.
os.system("ffmpeg -i {0} -c:v libx265 -crf 26 -c:a aac -b:a 160k output%d.mp4".format(filename))
print(filename)
Редактировать: я отредактировал команду FFmpeg, но все еще не работает в Google Colab.
Правка 2: Команда печати возвращает только имена файлов с расширением типа «MyMovie.mov» как мне указать полный путь к команде ffmpeg? Я также хочу поместить исходящие файлы во вложенную папку с именем x265
Комментарии:
1. Вы используете последовательный шаблон для имени выходного файла (
output%d.mp4
). Это работает только для вывода изображений и мультиплексора сегментов. Но вам не нужен ни один из них. Я предполагаю, что вы хотите что-то более похожееoutput/{0}
(но обратите внимание, что я не использую python).
Ответ №1:
Я попытался использовать ваш код, и часть Python кажется прекрасной. С помощью FFmpeg очень удобно иметь возможность проверять вывод ваших команд, вы должны проверять это каждый раз, когда ваша программа ведет себя не так, как вы хотите.
Итак, я проверил вывод FFmmpeg в моем терминале, и все казалось прекрасным. Действительно, ваша команда работает отлично, но может быть не той командой, которую вы хотите. Введенная вами команда выводит одно изображение из входного файла. Таким образом, он не кодирует видео.
Вы не очень ясно представляете, что вы хотите сделать, но я попытаюсь угадать:
- Если вы хотите кодировать видео из изображений, вам следует использовать такую команду
ffmpeg -r 24 -f image2 -i ПУТЬ К папке /frame%d.png ПУТЬ К папке /output.mp4
Итак, здесь вы указываете свою частоту кадров (24 не является обязательным) с помощью -r и формат ввода с помощью -f (в данном случае это изображения) Эта ссылка может помочь в этом случае.
- Если вы хотите отделить кадры от видео (которое ближе всего к вашей команде):
ffmpeg -i ПУТЬ К папке /video.mp4 ПУТЬ К ПАПКЕ/frame%d.png В этом случае может помочь эта ссылка.
В обоих случаях вы можете захотеть добавить 0 к нумерации в своих именах файлов для будущего использования фреймов, это объясняется там. Более поздняя ссылка шире предыдущей, но она должна охватывать вашу область использования FFmpeg.
Комментарии:
1. Спасибо за помощь, но по ошибке я ввел неправильную команду ffmpeg в исходное сообщение.
2. Есть ли у вас выходные данные команды FFmpeg? Вы установили FFmpeg в Google colab? (руководство там: colab.research.google.com/github/yunooooo /… )
3. Да, FFmpeg установлен в моем Google Colab, и он действительно работает, когда я использую его только для одного файла. Но когда я пытаюсь сделать это для папки (с помощью команды OP), я вообще не получаю выходных данных.
4. Возможно, вы уже сделали это, но вам следует проверить свои пути. Вы сказали, что печать выводит правильный путь, поэтому путь ввода должен быть правильным, но ваш путь вывода (здесь output.mp4) — это просто имя файла, поэтому в зависимости от того, где выполняется ваша оболочка, он может сохранять файл в другом месте. Попробуйте использовать
DIRECTORY "/output.mp4"
вместоoutput.mp4
5. Я пробовал это, но все еще безуспешно, вывод на печать возвращает только имя файла с расширением (mymovie.mov), но не путь
Ответ №2:
import os, sys, re
input_folder= '/content/drive/My Drive/Videos'
output_folder= '/content/drive/My Drive/Videos/X265'
quality_setting = '30'
file_type = 'mp4
my_suffixes = (".mp4", ".mov", ".mkv", ".avi", ".ts", ".flv", ".webm", ".wmv", ".mpg", ".m4v", ".f4v")
from pathlib import Path
Path(output_folder).mkdir(parents=True, exist_ok=True)
for filename in os.listdir(input_folder):
if (filename.endswith(my_suffixes)):
cmd = !ffmpeg -v quiet -stats -hwaccel cuvid -i "$input_folder/{filename}" -metadata comment="X265-QF$quality_setting-AAC" -c:v hevc_nvenc -preset:v slow -rc vbr -cq $quality_setting -c:a aac -b:a 160k "$output_folder/Seting1{filename}"