Может кто-нибудь сказать мне, где я иду не так, делая это.
Идея состоит в том, чтобы найти и преобразовать все файлы в каталоге в m4v. Независимо от расширения. Затем, после того, как он был преобразован, для создания миниатюры из предположительно «соответствующей» части преобразованного файла. Затем, как только это будет сделано, чтобы удалить исходный файл (в идеале, если он меньше, чем оригинальный - однако я еще не понял этот бит). Я очень новичок в сценариях оболочки, поэтому любая помощь будет наиболее ценной.
Затем я хотел бы добавить в будущем имя файла и детали к базе данных MySQL. Если у кого-нибудь есть какие-либо советы по этому поводу, я был бы очень признателен. Также, как добавить в проверку, чтобы пропустить преобразование для файлов, которые уже являются m4v.
#!/bin/bash
#Convert files using ffmpeg
OrDir="/Volumes/Misc/Test/"
NewDir="/Volumes/Misc/Conv2/"
find "$OrDir" -type f -exec /bin/bash -c \
'f2=$(basename "$1"); \
ffmpeg -i "$1" -c:v libx264 -crf 23 -preset ultrafast -c:a aac -strict experimental -b:a 192k -ac 2 "${NewDir}${f2%.*}.m4v" ' _ {} \;
ffmpeg -ss 3 -i "${NewDir}${f2}.m4v" -vf "select=gt(scene\,0.4)" -frames:v 5 -vsync vfr fps=fps=1/600 "${NewDir}pictures/${f2%.*}.jpg"
rm $1
ОБНОВЛЕНИЕ: я играл с этим много в последние несколько дней, и это то, что я получил в данный момент:
#!/bin/bash
#Convert files using ffmpeg
OrDir="/Volumes/Misc/Test"
find "$OrDir" -type f -exec /bin/bash -c \
'ND="/Volumes/Misc/Convert/"
f2=$(basename "$1")
eval $(ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=height,width "$1")
size=${streams_stream_0_height}
if [ "$size" -gt 720 ]
then
size=720
fi
ffmpeg -y -hide_banner -i "$1" -codec:v libx264 -profile:v high -preset ultrafast -b:v 500k -qmin 10 -qmax 42 -maxrate 1000k -bufsize 1000k -threads 0 -vf "scale=-1:$size" -pass 1 -c:a aac -strict -2 -b:a 128k -f m4v /dev$
ffmpeg -y -hide_banner -i "$1" -codec:v libx264 -profile:v high -preset ultrafast -b:v 500k -qmin 10 -qmax 42 -maxrate 1000k -bufsize 1000k -threads 0 -vf "scale=-1:$size" -pass 2 -c:a aac -strict -2 -b:a 128k "$ND${f2%.*$
ffmpeg -hide_banner -i "$ND${f2%.*}.m4v" -vf "select=gt(scene\,0.4), scale=-1:135, fps=1/60" -frames:v 5 -vsync vfr "${ND}pictures/${f2%.*}_%03d.png"
rm $1
mysql --host=****** --user=***** --password=****** db << EOF
INSERT INTO tbl (Name, FileType, Time, AddedDate) VALUES ("${f2%.*}", '.m4v', 0, NOW());
EOF
' _ {} \;
Это имеет две проблемы; во-первых, он не всегда генерирует миниатюры, иногда возвращает Output file is empty, nothing was encoded (check -ss / -t / -frames parameters if used)
однако созданный файл конвертируется отлично, а во-вторых, строка mysql isn ' t выполняется правильно, возвращая ошибку: _: line 12: mysql: command not found
Я также еще не выяснил, как определить продолжительность видео, чтобы добавить ее в базу данных.