为什么 libmp3lame 在 MP3 的开头添加零?

2023-12-02

我有一个未压缩的 .wav 文件,我将其转换为 96k MP3 文件:

ffmpeg.exe -i song.wav -vn -b:a 96000 -ac 2 -ar 48000 -acodec libmp3lame -y song.mp3

输入文件有 637386 个样本。输出有 639360 个样本。 MP3 中的额外样本在文件开头全部为零。这种情况发生在我翻译的每个文件中,并且使用的编解码器不仅仅是 libmp3lame。这是 FFMPEG 错误还是编解码器错误?为什么要添加这些?有没有办法阻止它们被添加?

编辑:简化的示例和控制台输出:

ffmpeg.exe -i song.wav -y song.mp3

ffmpeg version N-55796-gb74213d Copyright (c) 2000-2013 the FFmpeg developers
  built on Aug 26 2013 19:43:51 with gcc 4.7.3 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libcaca --enable-libfreetype --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxavs --enable-libxvid --enable-zlib
  libavutil      52. 42.100 / 52. 42.100
  libavcodec     55. 29.100 / 55. 29.100
  libavformat    55. 14.102 / 55. 14.102
  libavdevice    55.  3.100 / 55.  3.100
  libavfilter     3. 82.102 /  3. 82.102
  libswscale      2.  5.100 /  2.  5.100
  libswresample   0. 17.103 /  0. 17.103
  libpostproc    52.  3.100 / 52.  3.100
Guessed Channel Layout for  Input Stream #0.0 : stereo
Input #0, wav, from 'song.wav':
  Duration: 00:00:13.28, bitrate: 1538 kb/s
    Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 48000 Hz, stereo, s16, 1536 kb/s
Output #0, mp3, to 'song.mp3':
  Metadata:
    TSSE            : Lavf55.14.102
    Stream #0:0: Audio: mp3 (libmp3lame), 48000 Hz, stereo, s16p
Stream mapping:
  Stream #0:0 -> #0:0 (pcm_s16le -> libmp3lame)
Press [q] to stop, [?] for help
size=     208kB time=00:00:13.29 bitrate= 128.4kbits/s
video:0kB audio:208kB subtitle:0 global headers:0kB muxing overhead 0.111205%

wav 中的样本数量:637386

mp3中的样本数:639984


FFmpeg中LAME添加的延迟量为

avctx->initial_padding = lame_get_encoder_delay(s->gfp) + 528 + 1;

来自FAQLAME项目的:

2. 为什么 LAME 在每首歌的开头都添加了静音?

文件开头的解码器延迟:

All decoders我测试过引入528个样本的延迟。那 即,解码 mp3 文件后,输出将有 528 个样本 前面附加0。这是因为标准 ISO 使用的 MDCT/滤波器组例程有 528 个样本延迟。它 可以用 0 个样本编写 MDCT/filterbank 例程 延迟(参见 Takehiro 的 MDCT/filterbank 例程的描述 LAME编码如下)但我不知道有人这样做过。 此外,由于 MDCT 帧的重叠性质, 第一个颗粒的前半部分(1 个颗粒=576 个样本)没有 与前一帧重叠,导致第一帧衰减 N 个样本。 N 的值取决于窗口类型。为了 “STOP_TYPE”和“SHORT_TYPE”,N=96,而对于“START_TYPE”和 “正常_类型”,N=288。 LAME 3.56 及以上版本制作的第一帧 始终为 STOP_TYPE 或 SHORT_TYPE。

文件开头的编码器延迟:

基于 ISO 的编码器(BladeEnc、8hz-mp3 等)使用 MDCT/滤波器组 例程与解码中使用的例程类似,因此也引入 他们自己的528个样本延迟。编码和解码后的 .wav 文件将有一个 1056 个样本延迟(1056 个样本将附加到开头)。

常见问题解答中的差异与您的输出中的差异不同,可能是因为我不知道的技术细微差别,但这不是一个错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 libmp3lame 在 MP3 的开头添加零? 的相关文章

随机推荐

  • Python - 在 IF 语句中赋值并检查条件

    我有这个代码 str func parameter if not str do something 功能func 返回一个string关于成功和 失败时 这do something只有当str实际上包含一个字符串 是否可以对字符串进行赋值I
  • 我的页面底部和右侧的空间

    这是页面 财产测试 uphero com 我已将问题范围缩小到 6 个蓝色框 顶部 3 个位于名为 Offers 的 div 下 下面的 3 个位于名为 Properties 的 div 下 如果我把它们拿出来 空间就会消失 但我真的很想把
  • 将 pip 依赖项标记为显式安装

    我想区分我已显式安装的包和作为依赖项引入的包 您可以通过使用来做到这一点 not required option pip3 list not required format freeze 但是 如果我有一个包需要例如requests包 那么
  • 如何将 Java 枚举转换为 C#?

    我有一些 Java 代码 我想将其转换为 C srcParams 是一个哈希表 这是Java代码 for Enumeration keys srcParams keys keys hasMoreElements key keys nextE
  • tkinter 消息框阻止 Entry 小部件工作

    我有一个程序 有一个消息框来指导用户 但是关闭消息框后 我无法进入条目小部件 有谁知道可能是什么问题吗 My code from tkinter import import random import tkinter messagebox
  • python中的加权随机样本

    我正在寻找函数的合理定义weighted sample它不会只返回给定权重列表的一个随机索引 类似于 def weighted choice weights random random Given a list of weights w 0
  • 如何在OSGI框架中在运行时动态加载Java类?

    我们正在项目中执行 POC 其中我们发送基于 SOAP 的请求并相应地从 Web 服务获取 SOAP 响应 我们的目标是在我们的应用程序中利用 Spring 框架提供的 Web 服务模板 客户端 API 根据我们的架构 我们创建一个符合 O
  • 即使安装了 contrib,sift = cv2.xfeatures2d.SIFT_create() 也不起作用

    所以我尝试使用 sift cv2 xfeatures2d SIFT create 它出现了这个错误 cv2 error OpenCV 3 4 3 C projects opencv python opencv contrib modules
  • 在 numpy 中将 3 个一维数组连接在一起

    我将离开 MatLab 转而使用 numpy 总体来说一切顺利 但我正在做噩梦 要找到一种很好的 Pythonic 方法来完成在 MatLab 中可以完成的操作 A 1 0 2 0 3 0 4 0 Column vector B 5 0 6
  • 无法启动 Visual Studio 分析器

    我有 VS 2010 Ultimate 我创建了空的 win32 控制台解决方案 并将其 cpp 文件替换为http pastebin com EQJKJK6T我尝试执行 CPU 采样分析 但由于某种原因我收到以下消息 留言框 无法启动 e
  • 如何避免旋转时重新创建 Activity,同时尊重方向锁定?

    背景 每次旋转设备时 Android 都会销毁当前 Activity 并使用新配置重新创建它 避免重新创建活动的一个简单方法是添加 配置更改 清单中的值 我记得是 屏幕大小 和 方向 问题 如果您使用 configChanges 属性 应用
  • 如何将网页下载到 .NET 中的流中

    我知道这应该是一个基本问题 但我遇到了困难 我希望转到 URL URI 下载结果字符串 就好像我打开了一个文件一样 然后将其取出到 String 变量中 我一直在使用 IO Stream 和 Net httpxxx 但还没有设法让元素以正确
  • Matlab 绘图 - 字体 Zapf Dingbats 将不会渲染

    我有一个 Matlab 程序 需要在图中包含一个平面图标 Zapf Dingbats 40 每次我运行它时 它都会回退到系统字体 我做错了什么吗 这不是确切的代码 但说明了问题 title char 40 fontname ZapfDing
  • UIView animateWithDuration 立即返回

    我正在尝试为嵌入 UIView 中的标签设置动画 这是代码 void displayText NSString text label setText text UIView animateWithDuration 5 0 delay 0 0
  • 带有通配符参数的存储过程

    我有一张桌子 create table user userId varchar 8 not null userName varchar 8 not null insert into user select NAME1 name1 union
  • Highcharts 3.08 具有多个父系列的深入分析

    我正在使用 Highcharts 制作第一个向下钻取图表 我刚刚安装了 3 09 版本 其中内置了向下钻取支持 钻取图表将成为已包含多个图表的页面的一部分 所有图表都有 3 个系列 州 地区 子地区 数据动态填充 问题是钻取模块似乎不支持多
  • 通过代码将stdout重定向到C中的文件

    我正在输出到标准输出 如何通过代码将其重定向到新文件 当我们运行程序时 我们可以像这样重定向 sample gt test txt 在执行示例程序本身时如何做到这一点 C语言编程 您可能想使用freopen 参考示例 include
  • 如何在 LINQ to SQL 中使用WITH(NOLOCK)?

    我们可以像这样使用 SQL SELECT FROM student WITH NOLOCK 如何在不使用 LINQ to SQL 的情况下实现此目的TransactionScope LINQ to SQL 没有任何执行此操作的机制 但您可以
  • 获得焦点和失去焦点事件

    我的 java swing 表单中有 4 个 JTextfield 问题是我需要通过 java 代码而不是使用 Tab 键将焦点从一个 JTextField 移动到另一个 JTextField 如果JTextField2获得了Focus 则
  • 为什么 libmp3lame 在 MP3 的开头添加零?

    我有一个未压缩的 wav 文件 我将其转换为 96k MP3 文件 ffmpeg exe i song wav vn b a 96000 ac 2 ar 48000 acodec libmp3lame y song mp3 输入文件有 63