使用 pydub+ffmpeg 编码的 M4a (mp4) 音频文件无法在 Android 上播放

M4a (mp4) audio file encoded with pydub+ffmpeg doesn't play on Android

我有一个 python 脚本来拆分一些 wav 文件并使用 pydub 导出到 m4a。我可以让这些文件在多个设备上播放,但不能在 Android 设备(使用 Google Pixel 3)上播放。当我尝试在终端中直接使用 ffmpeg 进行编码时,它在 Android 设备上运行良好。

这两个文件有什么区别,既然pydub使用的是ffmpeg,我需要更改什么才能使其与ffmpeg命令完全相同?

不工作

from pydub import AudioSegment
>>> audio = AudioSegment.from_wav("input.wav")
>>> slice = audio[1000:3000]
>>> slice.export("pydub_export.m4a", format="mp4", parameters=["-ac", "1", "-c:a", "libfdk_aac", "-profile:a", "aac_he", "-vbr", "2"])

mediainfo 输出:

General
Complete name                            : pydub_export.m4a
Format                                   : MPEG-4
Format profile                           : Base Media
Codec ID                                 : isom (isom/iso2/mp41)
File size                                : 11.7 KiB
Duration                                 : 2 s 115 ms
Overall bit rate mode                    : Constant
Overall bit rate                         : 45.1 kb/s
Writing application                      : Lavf58.29.100

Audio
ID                                       : 1
Format                                   : AAC LC SBR
Format/Info                              : Advanced Audio Codec Low Complexity with Spectral Band Replication
Commercial name                          : HE-AAC
Format settings                          : NBC
Codec ID                                 : mp4a-40-5
Duration                                 : 2 s 115 ms
Duration_LastFrame                       : -22 ms
Bit rate mode                            : Constant
Bit rate                                 : 41.4 kb/s
Channel(s)                               : 1 channel
Channel layout                           : C
Sampling rate                            : 44.1 kHz
Frame rate                               : 21.533 FPS (2048 SPF)
Compression mode                         : Lossy
Stream size                              : 10.7 KiB (92%)
Default                                  : Yes
Alternate group                          : 1

工作

$ffmpeg -i input.wav -acodec copy -ss 1 -to 3 input_slice.wav
$ffmpeg -i input_slice.wav -ac 1 -c:a libfdk_aac -profile:a aac_he -vbr 2 ffmpeg_export.m4a

mediainfo 输出:

General
Complete name                            : ffmpeg_export.m4a
Format                                   : MPEG-4
Format profile                           : Apple audio with iTunes info
Codec ID                                 : M4A  (isom/iso2)
File size                                : 11.2 KiB
Duration                                 : 2 s 112 ms
Overall bit rate mode                    : Constant
Overall bit rate                         : 43.6 kb/s
Writing application                      : Lavf58.29.100

Audio
ID                                       : 1
Format                                   : AAC LC SBR
Format/Info                              : Advanced Audio Codec Low Complexity with Spectral Band Replication
Commercial name                          : HE-AAC
Format settings                          : NBC
Codec ID                                 : mp4a-40-5
Duration                                 : 2 s 112 ms
Duration_LastFrame                       : -25 ms
Bit rate mode                            : Constant
Bit rate                                 : 39.9 kb/s
Channel(s)                               : 1 channel
Channel layout                           : C
Sampling rate                            : 44.1 kHz
Frame rate                               : 21.533 FPS (2048 SPF)
Compression mode                         : Lossy
Stream size                              : 10.3 KiB (91%)
Default                                  : Yes
Alternate group                          : 1

我已经在损坏的文件上尝试了 moving metadata to the front-movflags faststart,但没有任何区别。

使用 pydub's logging,我能够准确地看到它生成的 ffmpeg 命令。

原来 pydub 中的 format=... 参数为 ffmpeg 提供了标志 -f ...。这只是找到要使用的正确 -f 参数的问题,mp4 给了我错误的文件。

建议 -f ipod。所以在 pydub 中使用 format="ipod" 给出了正确的输出。