2012-06-25 15 views
8

Sto usando ffmpeg per estrarre l'audio da diversi formati video (flv, mp4) e convertirlo in mp3.conversione ffmpeg - mantenere il bitrate audio

%~dp0ffmpeg.exe -i %1 -ar 44100 -ac 2 -ab 128k "%~dpn1.mp3" 

Questo funziona bene. Tuttavia, nei miei file di input, il bitrate audio varia e desidero regolare il bitrate di uscita di conseguenza. Anche con una lunga ricerca su Google, non ho trovato alcun suggerimento su come mantenere solo il bitrate originale.

Cosa avrei bisogno sarebbe qualcosa di simile:

-ab copy 

che, naturalmente, non funziona.

C'è qualcosa che funzionerà?

P.S: Come probabilmente avete capito dalla formattazione di cui sopra, sto usando un file batch di Windows. Ci sarebbe l'hack per usare % ~ dp0ffmpeg.exe -i, ottenere il bitrate audio di grep e inserirlo nella riga di comando. Penso solo che lo ha per essere un modo più semplice ed elegante.

+4

La copia del bitrate di solito non è una buona idea. Non tutti gli encoder sono uguali e puoi fidarti della persona che ha codificato i tuoi input per sapere cosa stavano facendo? Inoltre, questa domanda è più adatta per superuser.com. Credo che tu possa segnalare la tua domanda e richiederla di essere spostata se hai voglia di farlo. – LordNeckbeard

+1

Grazie, mi sembra ragionevole, mi hai fatto davvero riflettere. Quindi suppongo che mi limiterò a mantenere una qualità più elevata per ridurre al minimo la perdita di qualità, dal momento che la dimensione del mp3 finale non è comunque di cruciale importanza. – clausvdb

+0

Se non ti interessa una specifica dimensione del file di output, usa '-aq' o' -q: a' (equivalente a 'lame -V') per scegliere un livello di qualità di output e creare un output VBR. Vedi [Impostazioni LAME consigliate] (http://wiki.hydrogenaudio.org/index.php?title=LAME#VBR_.28variable_bitrate.29_settings) per un'idea del valore da utilizzare (il valore predefinito è 4). – LordNeckbeard

risposta

-2

Invece di

-ab copy 

provare

-sameq 


%~dp0ffmpeg.exe -i %1 -sameq "%~dpn1.mp3" 
+2

Ciao, grazie per l'idea. Sfortunatamente, ho provato anche quello, e finisco sempre con 64k. – clausvdb

+3

Inoltre, http://ffmpeg.org/trac/ffmpeg/wiki/Option%20%27-sameq%27%20does%20NOT%20mean%20%27same%20quality%27 – jonny

0

Ecco uno script bash che avrà un'estensione di file e estrarre l'audio da qualsiasi file con tale estensione, e, naturalmente, di mantenere il bitrate. Non posso rivendicare il credito del pezzo chiave del codice, come che va a the gentleman that writes this blog.

#!/bin/bash 

ext=$1 

for file in *.${ext}; do 
    tmpfn=${file%.*} ; # get rid of file ext 
    tmpfn=$tmpfn".mp3"; # add mp3 file ext 
    # next line gets bitrate of audio from video using ffmpeg 
    bit=`ffmpeg -i "${file}" 2>&1 | grep Audio | awk -F", " '{print $5}' | cut -d' ' -f1` 
    # finally, convert to mp3 using proper bitrate 
    ffmpeg -i "$file" -ab ${bit}k "$tmpfn" 
done 

Basta eseguirlo nella directory in cui si hanno i file in questo modo:

$bash script.sh flv 

dove flv è l'estensione del file. Hack it per farlo fare esattamente come desideri o elaborare più tipi di file per il contenuto del tuo cuore.

EDIT: solo una breve nota per chiunque su Ubuntu/debian/etc. Assicurati di installare il pacchetto di codec aggiuntivo altrimenti non funzionerà, cioè devi installare ffmpeg e il pacchetto di codec libav extra o avrai un brutto momento. Questo dovrebbe fare il trucco:

sudo apt-get ffmpeg libavcodec-extra-53 
1

anche se il thread originale era alla ricerca di una risposta senza grep nulla, lo script di Nate sembra essere il post più utile. ma ha alcune limitazioni, per esempio non tutte le uscite ti danno un bitrate in avarizia, qualche affluenza per darti solo il risultato "predefinito". ecco una versione leggermente migliorata di esso.

#!/bin/env bash 
ext=$1 
for f in *.${ext}; do 
    x=${f%.*} ; 
    x=${x% - YouTube}; # I usually download some song recvers from YouTube. 
    x=$x".mp3"; 
    bit=`ffmpeg -i "${f}" 2>&1 | grep Audio | awk -F", " '{print $5}' | cut -d' ' -f1` 
    if [ -n "$bit" ]; then 
     ffmpeg -i "$f" -ab ${bit}k "$x" 
    else 
     ffmpeg -i "$f" "$x" # this is if we don't have an output from the grep line above, ffmpeg will keep the original quality, that is 192k for 192k 
    fi   
done 
-1

La versione corrente di ffmpeg (testata 2.1.4) consiglia di utilizzare "-qscale 0" per preservare la qualità. Questo ha funzionato per me sul mio file di test video MPEG4.

+1

-qscale 0 non funziona per il bitrate audio come poster ha richiesto – antfx

0

Come afferma LordNeckbeard, utilizzare lo stesso bitrate per codificare in formati diversi non è necessariamente saggio. Tuttavia ...

Ecco una soluzione batch che cattura il bitrate del file di input e lo utilizza come parametro per la riga di comando della codifica. Questo approccio è stato accennato dall'interrogante originale.Il file di output mp3 viene creato nella stessa cartella del file di input.

@ECHO OFF 
SETLOCAL ENABLEDELAYEDEXPANSION 
REM Usage: scriptname.cmd "full-quoted-path-to-input-file" 
REM Adjust FFMPEG_PATH variable value to match the path to your FFMPEG binary 

SET FFMPEG_PATH=C:\Program Files\ffmpeg-20170807-1bef008-win64-static\bin 
SET INPUT_FILE_FULL_PATH=%1 

REM Get input file bitrate 
FOR /F "tokens=5 delims==," %%i IN ('""%FFMPEG_PATH%\ffmpeg.exe" -i %INPUT_FILE_FULL_PATH% 2>&1 | find "Audio:""') DO (
    FOR /F "tokens=1 delims==k" %%j IN ('ECHO %%i') DO ( 
     SET BITRATE=%%j 
     SET BITRATE=!BITRATE: =! 
     ECHO Input file bitrate is !BITRATE! kb/s 
    ) 
) 

REM Encode file using previously captured bitrate 
"%FFMPEG_PATH%\ffmpeg.exe" -i %INPUT_FILE_FULL_PATH% -ar 44100 -ac 2 -ab !BITRATE!k "%~dpn1.mp3" 

V'è spazio per serrare il codice su, per esempio, un controllo per assicurarsi che almeno un argomento è stato fornito, e che il BITRATE non è vuoto prima di iniziare la codifica, ma come soluzione rudimentale questo dovrebbe andare bene.

Problemi correlati