Може хто-небудь сказати мені, де я йду неправильно робити це.
Ідея полягає в тому, щоб знайти і перетворити всі файли в каталог до 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 не виконує правильно повернення помилки: _: line 12: mysql: command not found
Я також не зрозумів, як отримати тривалість відео ще додати, що до db, а також.
ffmpeg
зробіть ескіз з відповідну частину фільму? Що ви маєте на увазі відповідні ?
ultrafast
пресета x264.
ffmpeg
знати, що є відповідні для вас?