[英]How to change pitch and tempo together, reliably with ffmpeg
我知道如何用 atempo 改變速度,但音頻文件有點失真,而且我找不到改變音高的可靠方法。 (比如,將節奏和音高一起提高 140%)
Sox 有一個速度選項,但會截斷音量並且不像 ffmpeg 那樣廣泛可用。mplayer 有一個速度選項可以完美地工作,但我不能 output 沒有額外的庫。
我似乎明白 ffmpeg 沒有辦法改變音高(也許最近有?)但是有沒有辦法改變頻率或其他一些標志來模擬改變音高? 看得很遠,找不到合適的解決方案。
編輯:asetrate:48k*1.4(假設最初是 48k)似乎不起作用,失真和音高仍然沒有太大變化。
Edit2: https://superuser.com/a/1076762這個答案有點效果,但質量比sox speed 1.4
選項低得多
ffmpeg -i <input file name> -filter:a "asetrate=<new frequency>" -y <output file name>
似乎對我ffmpeg -i <input file name> -filter:a "asetrate=<new frequency>" -y <output file name>
。 我用ffprobe檢查了輸入文件和輸出文件的屬性,似乎沒有任何可能影響其質量的差異。 盡管確實運行了幾次,並且其中的某些文件上的結果確實有些瑕疵,即使代碼行相同,也可能是由ffmpeg錯誤引起的。 如果您對質量不滿意,請嘗試再次運行它。
截至 2022 年(盡管在 2015 年做出了貢獻),FFmpeg 有一個開箱即用的rubberband
過濾器,沒有任何上述丑陋、據稱速度慢、質量差和不直觀的解決方法。
要使用橡皮筋濾波器更改音高,您必須使用半音的頻率比指定音高。 這是基於使用公式 (2^x/12),其中 x 代表您想要移調的半音數。
例如,要向上移調一個半音,您可以使用以下命令:
ffmpeg -i my.mp3 -filter:a "rubberband=pitch=1.059463094352953" -acodec copy my-up.mp3
要向下轉置,只需對 x 使用負數。
要同時更改這兩個屬性,請指定tempo
和pitch
值。 tempo
值指定為原始速度的倍數。
以下命令將移調一個半音並將速度提高 4 倍:
ffmpeg -i slow.mp3 -filter:a "rubberband=pitch=0.9438743126816935, rubberband=tempo=4" -acodec copy fast.mp3
除非以統計方式衡量,否則質量下降是難以察覺的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.