Batch file ffmpeg转换-保持音频比特率

Batch file ffmpeg转换-保持音频比特率,batch-file,ffmpeg,Batch File,Ffmpeg,我使用ffmpeg从不同的视频格式(flv、mp4)中提取音频并将其转换为mp3 %~dp0ffmpeg.exe -i %1 -ar 44100 -ac 2 -ab 128k "%~dpn1.mp3" 这个很好用。但是,在我的输入文件中,音频比特率会发生变化,我希望相应地调整输出比特率。即使通过大量的谷歌搜索,我也没有找到任何关于如何保持原始比特率的提示 我需要的是: -ab copy 当然,这是行不通的 有什么有用的吗 附言:正如您可能已经从上面的格式中了解到的,我使用的是windows批

我使用ffmpeg从不同的视频格式(flv、mp4)中提取音频并将其转换为mp3

%~dp0ffmpeg.exe -i %1 -ar 44100 -ac 2 -ab 128k "%~dpn1.mp3"
这个很好用。但是,在我的输入文件中,音频比特率会发生变化,我希望相应地调整输出比特率。即使通过大量的谷歌搜索,我也没有找到任何关于如何保持原始比特率的提示

我需要的是:

-ab copy
当然,这是行不通的

有什么有用的吗

附言:正如您可能已经从上面的格式中了解到的,我使用的是windows批处理文件。使用%dp0ffmpeg.exe-i,通过grep获取音频比特率,并将其插入命令行,可能会有黑客攻击。我只是觉得有一种更简单、更优雅的方式

-ab copy
试一试


下面是一个bash脚本,它将采用文件扩展名并从具有该扩展名的任何文件中提取音频,当然还将保持比特率。我不能声称这段代码的关键部分是值得信任的,因为那是

#/bin/bash
分机=$1
对于*${ext}中的文件;做
tmpfn=${file%.*};#清除文件ext
tmpfn=$tmpfn“.mp3”#添加mp3文件扩展
#下一行使用ffmpeg从视频中获取音频的比特率
bit=`ffmpeg-i“${file}”2>&1 | grep Audio | awk-F“,“{print$5}”| cut-d'-f1`
#最后,使用适当的比特率转换为mp3
ffmpeg-i“$file”-ab${bit}k“$tmpfn”
完成
只需在您拥有如下文件的目录中运行它:

$bash script.sh flv
其中flv是文件扩展名。破解它,使其完全按照您的意愿运行,或处理多个文件类型以满足您的需要

编辑:对于Ubuntu/debian/等平台上的任何人来说,这只是一个简短的提示。确保你安装了额外的编解码器软件包,否则它将无法工作,也就是说,你必须安装ffmpeg和额外的libav编解码器软件包,否则你会有一段不愉快的时光。这应该可以做到:

sudo apt-get ffmpeg libavcodec-extra-53

尽管最初的帖子是在寻找答案,但没有任何改动,nate的脚本似乎是最有用的帖子。但是它有一些限制,例如,并非所有的输出都会给您一个比特率grepped,有些输出只会给您一个结果“default”。这里有一个更完善的版本

#/bin/env bash
分机=$1
对于*${ext}中的f;做
x=${f%.*};
x=${x%-YouTube};#我通常从YouTube上下载一些歌曲封面。
x=$x“.mp3”;
bit=`ffmpeg-i“${f}”2>&1 | grep Audio | awk-f“,“{print$5}”| cut-d'-f1`
如果[-n“$bit”];然后
ffmpeg-i“$f”-ab${bit}k“$x”
其他的
ffmpeg-i“$f”“$x”#如果我们没有上面grep行的输出,ffmpeg将保持原始质量,即192k对192k
fi
完成

当前版本的ffmpeg(已测试2.1.4)建议使用“-qscale 0”来保持质量。这对我的mpeg4视频测试文件很有用。

正如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"

有收紧代码的余地,例如,检查以确保至少提供了一个参数,并且在开始编码之前,
比特率不为空,但作为一个粗略的、现成的解决方案,这应该很好。尝试此选项:
-codec copy
-acodec copy
仅用于音频。

检查此参考

复制比特率通常不是一个好主意。并非所有的编码器都是平等的,你能相信编码你的输入的人知道他们在做什么吗?此外,这个问题更适合superuser.com。我相信如果你愿意的话,你可以把你的问题标出来,并要求把它移走。谢谢,这似乎很合理,你真的让我想到了这一点。所以我想我会坚持使用更高的质量来减少质量损失,因为最终的mp3大小并不重要。如果你不关心特定的输出文件大小,那么使用
-aq
-q:a
(相当于
lame-V
)来选择输出质量级别并创建VBR输出。有关使用什么值的想法,请参阅(默认值为4)。您好,谢谢您的想法。不幸的是,我也试过了,结果总是得到64k。而且,-qscale 0不适用于海报要求的音频比特率
@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"