使用 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"
给出了正确的输出。
我有一个 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"
给出了正确的输出。