8

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

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

这工作得很好。但是,在我的输入文件中,音频比特率会有所不同,我想相应地调整输出比特率。即使通过广泛的谷歌搜索,我也没有找到任何提示如何保持原始比特率。

我需要的是这样的:

-ab copy

当然,这不起作用。

有什么可行的吗?

PS:正如您可能从上面的格式中得出的那样,我使用的是 Windows 批处理文件。会有黑客使用%~dp0ffmpeg.exe -i,通过 grep 获取音频比特率并将其插入命令行。我只是认为必须有一种更简单、更优雅的方式。

4

6 回答 6

1

即使原始线程正在寻找答案而没有任何问题,但 nate 的脚本似乎是最有用的帖子。但它有一些限制,例如并非所有输出都会给你一个比特率grepped,一些投票给你只是结果“默认”。这是一个稍微改进的版本。

#!/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
于 2013-03-05T17:57:10.897 回答
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/etc 上的任何人来说只是一个简短的说明。确保您安装了额外的编解码器包,否则它将无法工作,即您必须安装 ffmpeg 和额外的 libav 编解码器包,否则您将度过一段糟糕的时光。这应该可以解决问题:

sudo apt-get ffmpeg libavcodec-extra-53
于 2012-10-09T22:33:18.937 回答
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在开始编码之前它不为空,但作为一个粗略且现成的解决方案,这应该没问题。

于 2017-12-31T12:01:40.517 回答
-1

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

于 2014-03-26T22:46:19.950 回答
-1

试试这个选项:-codec copy-acodec copy仅用于音频。
检查此参考http://ffmpeg.org/ffmpeg.html#Stream-specifiers-1

于 2020-03-17T10:20:49.813 回答
-2

代替

-ab copy

尝试

-sameq


%~dp0ffmpeg.exe -i %1 -sameq "%~dpn1.mp3"
于 2012-06-26T06:35:41.223 回答