Audio FFMPEG生成的音频文件比输入文件长

Audio FFMPEG生成的音频文件比输入文件长,audio,ffmpeg,bitrate,Audio,Ffmpeg,Bitrate,前言:我已经看了与本主题相关的stackoverflow主题。他们中没有人回答这个问题,也没有人与这个问题有任何关系 我在YouTube上制作LP视频。我最近开始使用.TS(传输流)文件记录答案。当通过ffmpeg从文件中提取第二个音频流时,我得到的音频文件比用作输入的视频文件长7秒。用作输入的文件为12:50,音频文件为12:57 我相信这是因为ffmpeg改变了文件的比特率。源比特率为167 kb/s,根据控制台输出,ffmpeg将其保存为164.7 kb/s 我知道我可以通过-b:a:0

前言:我已经看了与本主题相关的stackoverflow主题。他们中没有人回答这个问题,也没有人与这个问题有任何关系

我在YouTube上制作LP视频。我最近开始使用.TS(传输流)文件记录答案。当通过ffmpeg从文件中提取第二个音频流时,我得到的音频文件比用作输入的视频文件长7秒。用作输入的文件为12:50,音频文件为12:57

我相信这是因为ffmpeg改变了文件的比特率。源比特率为167 kb/s,根据控制台输出,ffmpeg将其保存为164.7 kb/s

我知道我可以通过-b:a:0 167k手动定义要另存为的比特率,但我希望此批处理文件可以与我提供的任何文件一起使用,并且所讨论的流的比特率会有所不同,因为它是mic/aux流。我正在批量编写一个实用程序,这样我就可以拖放文件来提取第二个音频流,所以我希望避免读取比特率,除非有一个ffmpeg命令返回输入文件中特定流的比特率,该流易于解析

对于可以使用-c:a:0 copy的编解码器,为什么不能在比特率上使用copy?对我来说这毫无意义

我用于提取音频的命令:

ffmpeg -i "%~1" -map 0:2 -c:a:0 copy "%~n1.aac"
整个批处理文件:

@echo off

REM This code checks to ensure the command-line variables have been properly set.

if [%1]==[] goto ALERT
if [%2]==[] (
    SET outpt="%~n1.aac"
    goto END_COMMENT
)
SET outpt="%~2"

GOTO END_COMMENT

------------------------------------------

The code below actually runs the extraction of the audio stream with the configured values

ffmpeg -i <input_file> -map 0:2 -c:a:0 copy <output_file>

ffmpeg -i <input_file> -map
    The base command, map tells ffmpeg that we wish to define the order of streams
    we with to operate on

0:2
    Defines the stream to work on, 0 is the input, so input 0 (the file) and 2 is the stream (0=video,1+=audio, last stream may be metadata)

-c:a:0 copy
    Codec of audio stream 0 for output should be an exact copy of all applicable settings from input stream

<output_file>
    The name of the file to output. The extension should match the codec. For most intents this will be .aac

------------------------------------------

:END_COMMENT

echo %outpt%

ffmpeg -i "%~1" -map 0:2 -c:a:0 copy %outpt%
goto END

:ALERT
@echo Incorrect usage: At least 1 param is required
@echo     ^<param^> = Required
@echo     [param] = Optional
@echo(
@echo     extract.bat ^<input_file^> [output_file]

:END
pause
@echo关闭
REM此代码检查以确保命令行变量已正确设置。
如果[%1]=[]转到警报
如果[%2]=[](
SET outpt=“%~n1.aac”
转到结束注释
)
SET outpt=“%2”
转到结束注释
------------------------------------------
下面的代码实际使用配置的值运行音频流的提取
ffmpeg-i-map 0:2-c:a:0拷贝
ffmpeg-i-map
基本命令map告诉ffmpeg我们希望定义流的顺序
我们需要做手术
0:2
定义要处理的流,0是输入,因此输入0(文件)和2是流(0=视频,1+=音频,最后一个流可能是元数据)
-c:a:0份
用于输出的音频流0的编解码器应该是输入流中所有适用设置的精确副本
要输出的文件的名称。扩展名应与编解码器匹配。在大多数情况下,这将是.aac
------------------------------------------
:结束(评论)
回显%outpt%
ffmpeg-i“%~1”-映射0:2-c:a:0拷贝%outpt%
转到终点
:警报
@echo使用不正确:至少需要1个参数
@echo^=必需
@echo[param]=可选
@回音(
@echo extract.bat^[输出文件]
:结束
暂停

根据请求,下面的文件是-v9-loglevel99的完整输出(我看不出8MB的[mpegts@Address]是有用的,但你可以这样做:

你可以发布完整的ffmpeg输出,包括命令中'-i'之前的'-v 9-loglevel 99'吗?嗯…当我输入时,我得到一个日志,时间太长了,我甚至无法复制所有日志…它一直在打印出来[mpegts@xxxxxxxxxxxxxxxxxxxxxx]在过去的5分钟里…好的,将输出重定向到一个日志文件,8 MB的详细数据…不知道如何发布那么多数据…更新了主帖子。你能发布ffmpeg的完整输出吗,包括命令中“-i”之前的“-v 9-loglevel 99”?嗯…当我输入时,我得到了一个很长的日志,我甚至无法复制所有的日志…这是一个问题在过去的5分钟内一直打印[mpegts@xxxxxxxxxxxxxxxxxxxxxxxx]…好的,将输出重定向到日志文件,8 MB的详细数据…不确定如何发布那么多数据…更新了主帖子。