我正在尝试使用 ffmpeg 修剪 .m4a 文件,即丢弃开头和结尾的某些部分,并对剩余部分应用淡入淡出效果,我希望保留这些部分,而无需重新压缩。
基本上,mp3DirectCut 可以对 mp3 文件执行此操作。
到目前为止效果并不理想。这可行吗?
关于我正在做的事情的更多细节:
期望的结果
使用 ffmpeg 分割文件没问题。我可以重新连接文件,生成的文件播放起来就像原始文件一样。我甚至尝试将源文件分割成数千个小文件,然后构建原始文件 - 一切仍然正常。
ffmpeg -i source.m4a -vn -c copy -f segment -segment_times 7.500574201520601,9.850499533190922,1559.5357313024108,1564.7855644901852 -segment_start_number 1 temp%d.m4a
下一步是在片段 2 和 4 上应用淡入和淡出滤镜。
ffmpeg -i temp2.m4a -af afade=t=in:curve=desi:st=0:d=1.8799402653362565 -c:a libfdk_aac -profile:a aac_he -b:a 95k tempFadeIn.m4a
ffmpeg -i temp4.m4a -af afade=t=out:curve=desi:st=0.5249833187774356:d=4.199866550219485 -c:a libfdk_aac -profile:a aac_he -b:a 95k tempFadeOut.m4a
最后一步是将 3 个部分重新连接在一起:
ffmpeg -f concat -safe 0 -i concat.txt -c copy final.m4a
最后的操作会给出以下类型的两个警告:
输出流 0:0 中的非单调 DTS;之前:74501074,当前:74498064;更改为 74501075。这可能会导致输出文件中的时间戳不正确。
在生成的文件中,声音在缝线处失真,波形显示存在小间隙。
根据使用的播放器,失真的声音会有所不同 - 因此它看起来像是损坏的文件,而不是实际插入的静音:
- ffplay-沉默
- vlc - 一个频道中有时会出现静音,然后出现很大的噪音
- wavesurfer.js(我将其用作 GUI)- 响亮的“黑胶唱片裂纹”
答案1
如果我没错的话,您尝试连接的两个流的时间尺度是不同的,请在连接之前尝试匹配两个流的时间尺度。
我使用此标志修复了同样的问题-video_track_timescale 90000
,但我的流既有音频又有视频。我还没有尝试过只对音频这样做,而且我在 FFMPEG 文档中也找不到音频时间标度的标志。所以我建议你尝试使用上面提到的标志。如果仍然不起作用,你可以尝试设置时间基准和音频采样频率(例如 -ar 48000)如果您仍然需要更好的解释,请参考: https://video.stackexchange.com/a/34392