Konversi semua file dalam direktori menggunakan FFMPEG

1

Saya mencoba menulis skrip untuk mengonversi semua file dalam direktori ke m4v, sementara mencoba untuk menjaga kualitas yang sama (jika tidak sama) dan mengkompres file untuk mengurangi ukuran keseluruhan.

Saya telah mengumpulkan skrip batch kecil tetapi tidak akan berjalan. Adakah yang bisa mengulurkan tangan / menyarankan cara terbaik untuk mengompres dan mempertahankan kualitas?

#!/bin/bash
#Convert files using ffmpeg
DIR="/Volumes/Misc/To Convert 2"
for i in $DIR; do ffmpeg -i "$i" -c:v libx264 -crf 19 -preset slow -c:a aac -strict experimental -b:a 192k -ac 2 "/Volumes/Misc/Converted/${i%.*}.m4v"
done

EDIT: OUTPUT Ini adalah output yang saya dapatkan ketika saya mencoba menjalankan skrip shell

ffmpeg version 2.6.1-tessus Copyright (c) 2000-2015 the FFmpeg developers
  built with Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn)
  configuration: --cc=/usr/bin/clang --prefix=/Users/tessus/data/ext/ffmpeg/sw --as=yasm --extra-version=tessus --disable-shared --enable-static --disable-ffplay --enable-gpl --enable-pthreads --enable-postproc --enable-libmp3lame --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libx265 --enable-libxvid --enable-libspeex --enable-bzlib --enable-zlib --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libxavs --enable-libsoxr --enable-libwavpack --enable-version3 --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvpx --enable-libgsm --enable-libopus --enable-libmodplug --enable-fontconfig --enable-libfreetype --enable-libass --enable-libbluray --enable-filters --disable-indev=qtkit --disable-indev=x11grab_xcb --enable-runtime-cpudetect
  libavutil      54. 20.100 / 54. 20.100
  libavcodec     56. 26.100 / 56. 26.100
  libavformat    56. 25.101 / 56. 25.101
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 11.102 /  5. 11.102
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  1.100 /  1.  1.100
  libpostproc    53.  3.100 / 53.  3.100
/Volumes/Misc/ToConvert: Operation not permitted
Tom
sumber

Jawaban:

3

Secara umum tidak aman untuk menguraikan output ls(lihat di bawah) dan demikian pula "*.*".

Saya sarankan untuk menggunakannya findmelindungi Anda dari nama file yang tidak biasa dengan karakter khusus.

#!/bin/bash
#Convert files using ffmpeg
OrDir="/Volumes/Misc/To Convert 2/"

find "$OrDir" -type f -exec /bin/bash -c \
    'f2=$(basename "$1"); \
     ffmpeg -i "$1" -c:v libx264 -crf 19 -preset slow -c:a aac -strict experimental -b:a 192k -ac 2 "/Volumes/Misc/Converted/${f2%.*}.m4v" ' _ {}  \;

Anda dapat memeriksanya dengan nama file seperti

  cp myfile.mpg myfile$'\n'with_new_line.mpg

Referensi

Cepat
sumber
Terima kasih untuk ini bekerja dengan baik (Harus menghapus .di depan jalan. Apakah ini digunakan untuk apa pun?
Tom
Sama-sama. Itu .? ...Nggak. hanya salah ketik (saya mencobanya di subdirektori lokal jadi ./what/ever/else)
Hastur
Anda mungkin juga ingin menautkan ke mywiki.wooledge.org/ParsingLs (lebih sedikit daripada pertanyaan Unix.SE)
slhck
Sslhck Terima kasih telah menambahkan referensi. Saya setuju ini lebih cepat dan tidak terlalu menakutkan.
Hastur
2

Karena nama direktori berisi spasi, Anda perlu mengutip "$DIR"untuk mencegah spasi diurai sebagai pemisah kata.

Saya juga menyarankan Anda sedikit mengubah for loop:

#!/bin/bash
DIR="/Volumes/Misc/To Convert 2"
cd "$DIR"
for i in *.*; do
    ffmpeg -i "$i" -your_option "/Volumes/Misc/Converted/${i%.*}.m4v"
done
Giorgio Bar
sumber