2012-06-25 175 views
8

我使用ffmpeg從不同的視頻格式(flv,mp4)中提取音頻並將其轉換爲mp3。ffmpeg轉換 - 保持音頻比特率

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

這工作得很好。但是,在我的輸入文件中,音頻比特率有所不同,我希望相應地調整輸出比特率。即使通過廣泛的Google搜索,我也沒有發現任何提示如何保持原始比特率。

我需要會是這樣的:

-ab copy 

其中,當然,不能正常工作。

有什麼可行的嗎?

P.S:正如你可能從上面的格式中得出的那樣,我正在使用一個windows批處理文件。將會使用%〜dp0ffmpeg.exe -i,通過grep獲取音頻比特率並將其插入到命令行中。我只是覺得是一個更簡單和更優雅的方式。

+4

複製比特率通常不是一個好主意。不是所有的編碼器都是平等的,你能相信編碼你的輸入的人知道他們在做什麼嗎?另外,這個問題更適合於superuser.com。我相信你可以標記你的問題,並要求它被移動,如果你想這樣做。 – LordNeckbeard

+1

謝謝,這似乎是合理的,你真的讓我想到那裏。所以我想我會堅持更高的質量來最大限度地減少質量損失,因爲最終的mp3尺寸無論如何不是至關重要的。 – clausvdb

+0

如果您不關心特定的輸出文件大小,則使用'-aq'或'-q:a'(相當於'lame -V')來選擇輸出質量級別並創建一個VBR輸出。請參閱[推薦的LAME設置](http://wiki.hydrogenaudio.org/index.php?title=LAME#VBR_.28variable_bitrate.29_settings)瞭解要使用的值(默認值爲4)。 – LordNeckbeard

回答

-2

而不是

-ab copy 

嘗試

-sameq 


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

嗨,感謝您的想法。不幸的是,我也嘗試過,而且我總是以64k結尾。 – clausvdb

+3

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

0

這裏是一個bash腳本,將文件擴展名,並從與該擴展名的文件中提取音頻,當然維持比特率。我不能說的代碼關鍵部分的信用,爲去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 

只要運行它的目錄,你有文件,像這樣:

$bash script.sh flv 

其中FLV是文件擴展名。對其進行破解,使其完全按照您的意願進行操作,或將多個文件類型處理爲您的內容。

編輯:只是一個簡短的說明Ubuntu/Debian/etc的任何人。確保你安裝了額外的編解碼器軟件包,否則它將無法正常工作,即你必須安裝ffmpeg和額外的libav編解碼器軟件包,否則你將會遇到不好的時間。這應該做的伎倆:

sudo apt-get ffmpeg libavcodec-extra-53 
1

即使原帖尋找沒有任何grepping回答,Nate的劇本似乎是最有用的帖子。但它有一些限制,例如不是所有的輸出都給你一個比特率的grepped,有些輸出給你只是結果「默認」。這裏有一點改進的版本。

#!/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

電流的ffmpeg(測試2.1.4)的版本建議使用 「-qscale 0」 以保持質量。這在我的mpeg4視頻測試文件中適用於我。

+1

-qscale 0不適用於音頻比特率正如海報所要求的 – antfx

0

正如LordNeckbeard所說,使用相同的比特率以不同格式進行編碼並不一定明智。但是...

這是一個批處理文件解決方案,它捕獲輸入文件的比特率並將其用作編碼命令行的參數。最初的提問者暗示了這種方法。輸出文件mp3創建在與輸入文件相同的文件夾中。

@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" 

仍有餘地緊縮的代碼了,例如,一個檢查,以確保至少有一個參數被提供,並且該BITRATE不開始編碼之前空的,但作爲一個粗略的和現成的解決方案這應該沒問題。