我正在使用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获取音频比特率并将其插入命令行。我认为 是一种更简单,更优雅的方式。
答案 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"