国语视界

 找回密码
 立即注册
查看: 5029|回复: 10

[音频技术] ffmpeg截取指定时长的音频,但实际得到的时长长得多

[复制链接]

18

主题

104

帖子

33

积分

列兵

大洋
279
阅读权限
10
发表于 20-9-20 22:47 | 显示全部楼层 |阅读模式
本帖最后由 yellowolf 于 20-9-21 10:34 编辑

测试用ffmpeg从一个样本wav文件截取指定时长(t=0.01)的片段,但得到的结果文件时长却长达0.05s。是不是我的姿势不对?还是0.05s是ffmpeg的最大精度?
测试代码如下:
1、生成wav样本文件:
  1. fs = 44100; %采样频率
  2. T = 1/fs; %采样周期
  3. time1 = 1024/fs*30; %第一个声音片段的总时长
  4. freq1 = 261; %第一个声音片段的频率(音调)
  5. tone1 = sin(2*pi*freq1*(0:T:time1)); %生成第一个声音片段,注意需要用db2mag()函数把dB转换成magnitude,或者用公式以人耳听力正常范围的分贝标准10^((vol-85)/20)转换。
  6. Tone = [tone1]; %组合所有声音片段
  7. sound(Tone,fs) %可以播放声音的函数 sound()
  8. %存储.wav音频文件
  9. filename = ('test.wav'); %给文件取名
  10. audiowrite(filename,Tone,fs) %存储.wav音频文件,在这里文件名为test.wav
复制代码


2、用ffmpeg截取指定时长的文件:
ffmpeg -i test.wav -vn -acodec copy -ss 0:0:0 -t 0:0.01 output1.wav
ffmpeg -i test.wav -vn -acodec copy -ss 0:0:0 -t 0:0.02 output2.wav
ffmpeg -i test.wav -vn -acodec copy -ss 0:0:0 -t 0:0.03 output3.wav
ffmpeg -i test.wav -vn -acodec copy -ss 0:0:0 -t 0:0.04 output4.wav
ffmpeg -i test.wav -vn -acodec copy -ss 0:0:0 -t 0:0.05 output5.wav

3、验证截取的精度:
  1. figure(1)
  2. N = 3;
  3. n = 0;
  4. n = n + 1;
  5. subplot(N,1,n)
  6. [test1, fs] = audioread('test.wav');
  7. plot(test1) %可以画出声音的波形图
  8. n = n + 1;
  9. subplot(N,1,n);
  10. [test2, fs] = audioread('output4.wav');
  11. plot(test2) %可以画出声音的波形图
  12. n = n + 1;
  13. subplot(N,1,n);
  14. [test3, fs] = audioread('output5.wav');
  15. plot(test3) %可以画出声音的波形图
复制代码


4、奇怪的结果:
output1~output4的时长都是一样的,0.05s,从文件大小看也是一样的。;
output5的时长突然变为0.09s。
求专业大佬解惑。

0

主题

2810

帖子

1117

积分

营长

大洋
157056
阅读权限
50
发表于 20-9-21 00:17 | 显示全部楼层
音频有二三十毫秒的差距其实没啥影响,强迫症除外……个人看法
回复 支持 反对

使用道具 举报

18

主题

104

帖子

33

积分

列兵

大洋
279
阅读权限
10
 楼主| 发表于 20-9-21 01:47 | 显示全部楼层
gyqhd 发表于 20-9-21 00:17
音频有二三十毫秒的差距其实没啥影响,强迫症除外……个人看法

这个只是测试的第一步,如果不尽量精确,后面很难进行。我想弄一个自动检测demux音频偏移量的程序,涉及的问题很多,m2ts中分离音频,多m2ts,多种音频格式,必须搞清楚检测时每一步误差产生的原因,而从单声道wav文件中尽量精确地提取样本是最基本的操作了。
回复 支持 反对

使用道具 举报

8

主题

2万

帖子

8804

积分

旅长

大洋
153484
阅读权限
70

灌水之王热心会员论坛元老

发表于 20-9-21 06:32 | 显示全部楼层
有最低截取长度
回复 支持 反对

使用道具 举报

149

主题

2886

帖子

3016

积分

团长

大洋
1402
阅读权限
60
发表于 20-9-21 09:37 | 显示全部楼层
太专业了,看的有点懵
回复 支持 反对

使用道具 举报

0

主题

2810

帖子

1117

积分

营长

大洋
157056
阅读权限
50
发表于 20-9-21 14:38 | 显示全部楼层
yellowolf 发表于 20-9-21 01:47
这个只是测试的第一步,如果不尽量精确,后面很难进行。我想弄一个自动检测demux音频偏移量的程序,涉及 ...

啊这……太高大上了,已经到了知识盲区了,帮不了你了,希望你能找到答案
回复 支持 反对

使用道具 举报

5

主题

4034

帖子

480

积分

排长

大洋
50340
阅读权限
30
发表于 20-9-21 16:27 | 显示全部楼层
这个很正常,你计划的是按时间长度截取,实际处理肯定是按帧来处理的,帧要完整就容易导致时长要么比你定时长的多出或者少掉。
回复 支持 反对

使用道具 举报

274

主题

4866

帖子

6万

积分

炊事员

大洋
315473
阅读权限
120

灌水之王热心会员论坛元老王者至尊

发表于 20-9-21 18:39 | 显示全部楼层
你这个问题很有意思,我试了一下,ffmpg截取音频会产生随机误差,截取同样时长误差是相同的,增加样本数量,不会超过50毫秒。你这变化这么大,我这没发现。但是用MKVToolNix GUI截取是准确的,有兴趣可以自行测试。附图



mkv截取5s



ffmpeg截取5s两次比较
回复 支持 反对

使用道具 举报

274

主题

4866

帖子

6万

积分

炊事员

大洋
315473
阅读权限
120

灌水之王热心会员论坛元老王者至尊

发表于 20-9-21 20:35 | 显示全部楼层
gumfifa 发表于 20-9-21 18:39
你这个问题很有意思,我试了一下,ffmpg截取音频会产生随机误差,截取同样时长误差是相同的,增加样本数量 ...

补充,看错了,你截取50ms,不知有啥实际意义。ffmpeg情况类似,误差在50ms以内。mkv不再精确,产生误差,看来超过允许范围。
回复 支持 反对

使用道具 举报

18

主题

104

帖子

33

积分

列兵

大洋
279
阅读权限
10
 楼主| 发表于 20-9-22 18:02 | 显示全部楼层
zhangyun_1 发表于 20-9-21 16:27
这个很正常,你计划的是按时间长度截取,实际处理肯定是按帧来处理的,帧要完整就容易导致时长要么比你定时 ...

小白圡问,WAV编码的音频文件中截取也有关键帧引起的误差问题吗?
回复 支持 反对

使用道具 举报

18

主题

104

帖子

33

积分

列兵

大洋
279
阅读权限
10
 楼主| 发表于 20-9-22 18:06 | 显示全部楼层
gumfifa 发表于 20-9-21 20:35
补充,看错了,你截取50ms,不知有啥实际意义。ffmpeg情况类似,误差在50ms以内。mkv不再精确,产生误差 ...

大佬,我其实是想写个自动化的程序,检测音轨的demux结果与源BD/REMUX是否完全同步。所以用来分析的样本不能太长,否则分析起来很慢。当然适当延长应该也是可以的。
我后来找到这个时长误差的原因了,是命令行写得不合理的缘故。我的样本不含有视频流,因此ffmpeg不支持-vn -acodec copy参数,把它们去掉就完全正常了.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表