ffmpeg转换 - 保持音频比特率

时间:2012-06-25 20:00:55

标签: batch-file ffmpeg

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

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

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

我需要的是:

-ab copy

当然,这不起作用。

有什么可行吗?

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

6 个答案:

答案 0 :(得分:1)

即使原始帖子在没有点击任何内容的情况下寻找答案,nate的脚本似乎是最有用的帖子。但它有一些限制,例如并非所有输出都会给你一个比特率,一些道岔给你的结果是“默认”。这是一个更加改进的版本。

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

答案 1 :(得分: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

答案 2 :(得分: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不为空,但作为粗略的准备解决方案这应该没问题。

答案 3 :(得分:0)

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

答案 4 :(得分:-1)

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

答案 5 :(得分:-2)

而不是

-ab copy

尝试

-sameq


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