FFmpeg 转换 - 保持音频比特率

10

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

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

这很好用。然而,在我的输入文件中,音频比特率是不同的,我想相应地调整输出比特率。即使通过广泛的谷歌搜索,我也没有找到任何提示如何保持原始比特率。
我需要的是像这样的东西:
-ab copy

当然,那不起作用。

有什么可以行得通的方法吗?

P.S:从上面的格式中,您可能已经猜到了,我正在使用Windows批处理文件。有一个方式是使用%~dp0ffmpeg.exe -i命令,通过grep获取音频比特率并将其插入到命令行中。我只是认为应该有一种更简单、更优雅的方法。


4
复制比特率通常不是一个好主意。并非所有编码器都相同,你能相信编码你输入内容的人知道他们在做什么吗?此外,这个问题更适合于superuser.com。如果您感觉需要,我相信您可以标记您的问题并请求将其移动。 - llogan
1
谢谢,那听起来很合理,你真的让我思考了。所以我想我会坚持使用更高质量的方式来最小化质量损失,因为最终的mp3大小并不是非常重要。 - clausvdb
如果您不关心特定的输出文件大小,则可以使用-aq-q:a(相当于lame -V)选择输出质量级别并创建VBR输出。请参阅推荐的LAME设置以了解要使用的值的想法(默认值为4)。 - llogan
6个回答

1
尽管原帖没有使用grep,但Nate的脚本似乎是最有用的帖子。但它有一些限制,例如并非所有输出都会给出一个被grep的比特率,有些只会给出“默认”结果。这是一个更改进的版本。
#!/bin/env bash
ext=$1
for f in *.${ext}; do
    x=${f%.*} ;
    x=${x% - YouTube}; # I usually download some song covers 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

0
这里有一个 Bash 脚本,它将提取具有指定扩展名的任何文件的音频,并保持码率。其中一部分代码来自于这位写博客的先生,因此我并不能完全获得代码的功劳。
#!/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等系统的用户,请确保安装了额外的编解码器包,否则将无法正常工作。也就是说,你必须安装ffmpeg和额外的libav编解码器包,否则会遇到问题。下面的步骤应该能解决这个问题:

sudo apt-get ffmpeg libavcodec-extra-53

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不为空,但作为一种粗略的解决方案,这应该足够了。


-1

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


2
-qscale 0 不适用于音频比特率,正如发布者所要求的那样。 - antfx

-1

-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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接