我正在尝试连接15个wav音频文件,记录为24位,96kHz,线性PCM。我用ffmpeg,sntool和sox进行了实验,结果却不同。
这些文件是由Zoom H2n记录器创建的,该记录器将大约15小时的连续记录(实时)分为几个文件,以适应SD存储卡规格。
前14个文件各为2,147,385,344字节(时间为1:02:08.04),最后一个文件为1,838,248,046字节(时间为53:11.35)。原始文件报告的比特率为4608 kb / s(使用ffmpeg -i)。
使用ffmpeg
使用文件名创建一个文本文件:
printf "file '%s'\n" ./*.WAV > mylist.txt
连接文件:
ffmpeg -f concat -i mylist.txt -c copy output-ffmpeg.wav
这将生成一个31,901,151,444字节的文件,但报告的时间仅为53:08。ffmpeg -i报告的比特率为80,049 kb / s,远高于原始的4,608 kb / s。
使用shntool
加入文件:
shntool join -r none 01.wav 02.wav [etc]
这将生成一个31,901,151,386字节的文件-与ffmpeg串联的文件不同-但报告的时间为53:08.16。ffmpeg -i再次报告了80,049 kb / s的比特率,远高于原始的4,608 kb / s。
使用袜
连接文件:
sox 01.wav 02.wav [etc] output-sox.wav
这将生成一个31,901,151,422字节的文件-与ffmpeg和shntool都不同-但报告时间为01:02:08.26。ffmpeg -i报告的比特率为68,452 kb / s,远高于原始的4,608 kb / s,但与ffmpeg或shntool转换不同。
问题
1)如何使文件反映其实际时间?将这31 Gb /〜15小时的录音带入认为只有53分钟左右的音频软件中可能会出现问题。
2)为什么这三个串联的文件大小不同?例如,出于某种原因,我应该使用某个标志或设置来填充长度吗?不同的文件大小是否是为什么文件认为它们只有53:08或01:02:08长的线索?
当我第一次看到53:08时,我想是的,这是将最终文件的时间长度写入标头中-但是最终文件的时间长度实际上是53:11。当我第一次看到01:02:08.26时,我想是的,它正在写FIRST文件的时间长度,但是可悲的是,没有(接近,但不准确)。
似乎我最好的线索是所连接文件的比特率不正确(?)。我很惊讶流副本或文件串联更改了这一点。也许仅仅是元数据错误?
.wav
是RIFF
文件格式(msdn)
RIFF块数据的大小以32位存储。(最大无符号值是4294967295)
RIFF限制为每个文件约4.2 GB。
当软件创建非常大的RIFF块时,其存储大小为32位值。
在某个时候发生整数溢出,并且丢弃更高的数字位:
示例文件:6.220 GBytes / 3:00:00 / 96000 Hz / 24位/ 2通道/ 4608 kbit / s
Real file size(hex): 01 72 C9 E0 86 (6 220 800 134)
Readed from RIFF header(hex) : 72 C9 E0 7E (1 925 832 830)
Real file size(binary): 1 01110010 11001001 11100000 10000110 //33 bits
Readed from RIFF header(binary): 01110010 11001001 11100000 01111110 //32 bits
01
这里是丢弃的部分。
ffprobe报告:
Duration: 00:55:43.46, bitrate: 14884 kb/s
Stream #0:0: Audio: pcm_s24le ([1][0][0][0] / 0x0001), 96000 Hz, 2 channels, s32 (24 bit), 4608 kb/s
FFprobe找不到文件中的任何元数据,并尝试根据真实数据进行计算:
持续时间为(整个块大小除以比特率):
1 925 832 830 / (4 608 000 / 8) = 3343.459 seconds
/ 8
是因为比特率是每秒位数(一个字节是8位)
3343.459就是00:55:43.459
(平均?)整个文件的比特率是SizeOfFile / TotalSeconds:
6 220 800 134 / 3343.459 = 1860588.1316字节s / s(14884705.053位s / s)
使用其他格式存储它,例如:
FLAC / .rf64 / .w64 /等
使用ffmpeg(FFmpeg Wiki页面连接)连接文件:
ffmpeg -f concat -i mylist.txt -c:a flac output-ffmpeg.flac
这里mylist.txt
是
file '/path/to/file1.wav'
file '/path/to/file2.wav'
file '/path/to/file3.wav'
你可以玩它。所有的。有招。
我们将RIFF数据块的大小设置为0
。这将导致某些(?)音频播放器读取整个数据块(直到文件末尾?)。
来自已编辑文件的FFprobe报告:
Duration: 03:00:00.00, bitrate: 4608 kb/s
Stream #0:0: Audio: pcm_s24le ([1][0][0][0] / 0x0001), 96000 Hz, 2 channels, s32 (24 bit), 4608 kb/s
注意:在HEX编辑器中保存文件时,不需要重写完整文件。
00
。save
然后按Cancel
按钮(以防止创建完整的备份副本)但是,如果.WAV在文件末尾包含一些元数据,则FLAC将丢弃错误。
经过Audacity测试。使用HEX编辑器进行了检查,并在文件末尾找到了元数据。
FLAC:ERROR: got partial sample
但文件长度为2:59:59秒。并且没有md5校验和。
这意味着我们还没有真正的flac文件(读取损坏)。
但是可读。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句