Batch convertendo arquivos usando o ffmpeg

0

Alguém pode me dizer onde estou errado fazendo isso.

A idéia é encontrar e converter todos os arquivos em um diretório para o m4v. Independentemente da extensão. Então, uma vez convertido, para gerar uma miniatura de uma parte supostamente "relevante" do arquivo convertido. Então, uma vez feito isso para remover o arquivo original (idealmente se for menor que o original - no entanto, ainda não descobri isso). Sou muito novo em shell scripts, então qualquer ajuda seria muito apreciada.

Eu gostaria, no futuro, de adicionar o nome do arquivo e os detalhes a um banco de dados MySQL. Se alguém tiver alguma dica sobre isso eu ficaria muito grato. Também como adicionar um cheque para pular a conversão em arquivos que já são do 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

ATUALIZAÇÃO: Eu tenho brincado muito com isso nos últimos dias e é isso que eu tenho no momento:

#!/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
     ' _ {} \;

Isso tem dois problemas; em primeiro lugar Ele nem sempre gera as miniaturas, às vezes retornando Output file is empty, nothing was encoded (check -ss / -t / -frames parameters if used) no entanto o arquivo que é criado é convertido perfeitamente e em segundo lugar a linha mysql não está executando corretamente retornando o erro: _: line 12: mysql: command not found eu também não descobri como obter a duração do vídeo ainda para adicionar isso ao banco de dados também.

    
por Tom 06.07.2015 / 22:04

1 resposta

0

Se você está planejando expandir esse script - o que, a partir de sua pergunta sobre um banco de dados, você é -, eu recomendaria a alteração de parâmetros tanto quanto possível.

Também recomendamos o uso de ffmpegthumbnailer para gerar as miniaturas, que devem ser um simples yum install ffmpegthumbnailer / apt-get install ffmpegthumbnailer longe. Marque as opções - no meu script eu gerei uma miniatura do mesmo tamanho ( -s0 ) como original, mas você pode não querer isso.

Este script de exemplo deve ajudá-lo a começar:

#!/bin/bash
# Convert files using ffmpeg
# USE AT YOUR OWN RISK!

# Parameters
OrDir="/tmp/video/"             # Original directory
NewDir="/tmp/video/out/"        # New directory
PicsDir=${NewDir}pictures/
ignore="m4v"                    # ignore single filetype being converted
convto="$ignore"                # in case you want to convert to something else
thumbnailseek=5                 # Seek % at which to generate thumbnail

# Change to original directory
# For each file:
#       check appropriate (exists, not directory, not already same type)
#       convert to $convto type media file (ffmpeg)
#       generate thumbnail (ffmpegthumbnailer)
#       (optional) remove original if new version smaller

cd "$OrDir"
for oldfile in *.mkv; do        # indeed every file; globbing will eat up  spaces properly
    ext=${i##*.}
    # ignore 1) non-existant files 2) directories 3) $ignore-extentioned files
    if [[ ! -e "$oldfile" ]] || [[ -d "$oldfile"  ]] || [[ "$ext" = "$ignore" ]]; then
            continue
    fi

    filename=${oldfile%.*}
    newfile="$NewDir$filename.$convto"
    oFS=$(stat --printf="%s" $oldfile) # old file size

    ffmpeg -y -loglevel quiet -i "$oldfile" -c:v libx264 -crf 23 -preset ultrafast -c:a aac -strict experimental -$
    nFS=$(stat --printf="%s" $newfile) # new file size

    ffmpegthumbnailer -s0 -i "$newfile" -t $thumbnailseek -o "$PicsDir$filename.jpg" &>/dev/null
    if [ "$oFS" -gt "$nFS" ]; then
            #rm -- "$OrDir$oldfile" # AT OWN RISK: uncomment to remove older file if smaller
    fi
done

Não sou especialista, pois qualquer leitura cuidadosa do código acima será exibida. Eu misturei minhas próprias convenções de nomeação de variáveis com as do código original (minha intenção era manter alguma familiaridade); Eu poderia ter mais parâmetros; Eu codifiquei um número razoável de suposições no script (como OrDir contendo apenas arquivos de vídeo, por exemplo); alguns testes condicionais poderiam ser simplificados; manuseio de nome de arquivo e diretório poderia ser feito uniforme.

Mas isso não é Revisão de código . Não deve haver nenhum erro gritante, e funciona localmente em alguns mkvs que eu tinha chutando apenas esperando por algo assim.

Se você pretende fazer muito mais com o bash scripting, vale a pena ler algumas armadilhas comuns , e se você tenha o tempo que o Guia de script avançado do Bash .

Para o 'banco de dados SQL', mais informações são necessárias para fornecer qualquer tipo de aviso. Que tipo de banco de dados? SQLite? Por que SQL em tudo, versus um simples arquivo simples (CSV, etc)? Quais detalhes?

    
por 07.07.2015 / 02:48