程序員大牛與菜雞分別寫音樂播放器,播放同一首歌,音質會有差別嗎?

想知道在聽歌時,播放器對音樂是否有影響呢?看到好多人氪大價錢買好耳機,耳機是否是占聽歌體驗的主導因素嗎?


播放器對音質有影響嗎?有。但大多數情況下你聽不出來。

影響在哪些方面?

  1. 對於有損編碼,不同解碼器解碼質量都不太一樣,調用不同解碼器所得的音質可以有很大差別。但現在主流解碼器也就那麼幾個,大家也都差不多了,你也很難自己擼一個更好的出來。而無損編碼的話,解碼輸出理應沒有區別。
  2. 播放器中必然涉及重採樣、不同位深之間的轉換,浮點與定點之間的轉換。不同的重採樣演算法、不同的 dithering 和 rounding 策略都會引入差別。重採樣演算法之間的差別還是比較大的,但一般是調用現成的庫或者調用系統的重採樣,所以大家差別也不大。dithering 和 rounding 引入的誤差,基本上大多數人都聽不出來。其實如果你是直接把解碼出來的音頻送給系統 API,這些過程都是被系統 mixer(存在於 WASAPI、Core Audio、PulseAudio、AudioFlinger 等系統 audio server 中)做掉了,不需要你自己去做。
  3. 如果播放器中有音效處理的話,那差別就更大了。但音效沒有特別客觀的評價標準。這裡我就不討論這個問題了。但也要指出,同一個音效演算法即使使用同一套參數,不同的處理精度,不同的優化等都會對其處理結果產生影響。
  4. 另外在音頻處理中還有一些常用的優化技巧,比如盡量在初始化的過程中分配好所有內存,處理過程中不再向系統請求內存。這樣可以提高實時性,防止在播放過程中產生可聽見的中斷,也就是 click 的產生。但現在電腦性能那麼高,即使不這麼做,產生 click 的可能性也已經比以前大大降低了。如果是在 DSP 晶元上,就必須這麼做了。

解碼演算法在普通程序員涉獵範圍之外。但沒有說需要數學家和生物學家那麼神。僅理解和實現的話,DSP(不是Demand Side Platform),一些工程數學和心理聲學是前置知識。

解碼的api有庫調用。調用後你有了pcm數據,那麼只需要按當前設備(電腦或手機的音效卡)支持的採樣率播放就行。如果解碼庫不帶採樣率轉換,且解碼出來的採樣率硬體設備不支持(很多電腦音效卡只支持一個採樣率),此時需要自己做一個實時的採樣率轉換。這裡也涉及一些工程數學插值演算法和低通濾波器(需一些DSP知識)。

解碼和採樣率轉換都會影響最終得到的數字信號。題主問的題目範疇只涉及數字信號部分,而對這一部分,程序員範疇里高級低級的一般都是調用解碼庫,庫一般也都帶採樣率轉換。所以不會有啥差別。
如果高手自己做解碼或者採樣率轉換,那問題就變成了寫解碼庫的高手和此高手的對比,不是普通人和高手的對比了,不符合題目要求所以不討論了。

回答題主的另一部分問題:耳機和音箱對你聽感影響當然是最大的。如果用音箱的話,你的聽音環境(你的房間)影響也很大。


取決於系統和硬體特性。

假設硬體播放器K支持硬體192k 24bit輸出,硬體播放器S 只支持44.1K 16bit。

A播放器將192K 24bit的歌曲使用FFMPEG解碼後轉換成48K 16bit的pcm流輸出。

B播放器將一首192K 24bit的歌曲使用FFMPEG解碼後不轉換採樣率,數據格式轉換為32bit(Android 系統不支持24bit,24bit需要轉換為32位浮點)輸出。

那麼 A B播放器在硬體S播放器上效果是一樣的,而在硬體K播放器上 B軟體的效果明顯優於A。

現在流行的網易雲音樂就是自帶解碼庫然後src到44.1K 16bit的。


差別非常大,筆記本外放我都能聽出來,while循環聲音更純,但是複雜混音解析度不夠,for循環在對於i的操作過於規整化,導致內存固定周期的讀寫會產生干擾波,不屬於白噪,會導致音樂略微失真。

好的播放器儘可能使用靜態變數,不得不用非靜態的時候盡量讓變數創建和刪除的時候有高頻音或鼓點的遮蓋,這個就非常需要經驗了。不過現在可以用機器學習來解決。

內存回收一定要手動進行,不要用智能指針,更不要用java,java寫出的播放器內存塊不停移動的噪音就像一個施工隊在你家窗外修路一樣。android音質一直不如iphone和語言也有很大關係。

新手寫的播放器往往只有一種解碼方式,能聽個響就算成功。高手寫的播放器至少要有6個解碼模塊來適配不同類型的電流,還有一個電流預判的貝葉斯模塊來預測電壓波動和抗電涌,和一個解碼器實時調參模塊來做分支預測選擇合適的參數適配電流,調參模塊非常難,沒有大cpu廠做分支預測5年以上經驗的,基本搞不好。6個基本模塊分別是針對水電,火電,風電,核電,電池和太陽能,但是現在城市供電都是混合供電,一般還需要一個卡爾曼濾波器來對6個解碼模塊加權來進行協作解碼。

最終解碼出的信號還需要和原音頻信號和解碼時電流特徵信號做一次畸變修正才能傳輸進音頻輸出介面里。

新手寫的播放器在無外界電磁干擾,設備用電池的時候還勉強能聽。但是需要外接電源的時候基本屬於噪音生成器,高手寫的播放器無論電池還是電源基本能達到一致。


單純說寫一個播放器,有沒有區別我不知道,但是市面上的播放器軟體播放出來的東西絕對有區別。

哪怕是大名鼎鼎的foobar2000播放器官方也表示自己的播放器並不能起到優化音質的作用,只是靈活性很高罷了,可以有很多功能以及接受各種調教,而本身播放器出來的就是單純直白的聲音。

可問題是,市面上什麼酷狗什麼蝰蛇的……大批的播放器都在做負優化,聽聽就知道了,他們為了照顧聽音設備在及格線以下的人而人為的增加音效,音效乍一聽很唬人,可是音質被犧牲了。細聽的話越聽聲音越糊。

反正免費的大家下載下來對比下就知道了……

所以,單純說調用系統api這個,大體上理論上我認為不會有什麼區別,實際上不做討論(哪怕有影響也不會太大)

自己寫解碼程序(解為pcm碼這個過程)的話可能有影響,然而也沒啥人會去寫那玩意………

但是不同音樂播放器絕對有音質區別。不在於高手寫得有多好,而在於各種播放器軟體自作多情負優化得有多爛。

我電腦聽歌用foobar2000,除了這玩意沒負優化之外,最大的好處就是界面簡單幹凈,啟動快,資源佔用少。直觀感受上,foobar2000的軟體啟動速度甚至快於windows media player。

另外,這題雖然看起來不怎麼嚴肅,但是探討的內容不是不能深究。我這篇答案就夠沒幹貨了,然而題目下開玩笑那些答案都什麼鬼?發燒友為了聽歌選不同電的那個梗多少年了?翻來覆去用老梗煩人這事兒是我小學乾的了。心智一個個的都不如小學生?這行為一點都不幽默,無聊


音頻播放是個技術棧很深的分枝。

莫說菜雞,連大牛要寫出來都是很花時間的,尤其是到要影響音質這個層面。

認清楚,能看懂別人的音頻庫的都絕對不能稱呼他們做菜鳥了。

理論上來說,演算法一樣的話,重現之後的輸出是一樣的。

解碼器不好寫,但解碼器理論上只有儲存方法和型態的不一樣,影響極小。

到重現時,就有一大堆技術活了,比如說XM 音樂會有ClipCopy 的動作,這些為了在控制上沒坑,很多時到用到匯編去實現。回到C層面時針對32bit 的位操作也是天書。

另外,影響音質最大的還有音量參數的Ramping,Ramping 時操作FPU 也是令人嘔吐的工作。

差距主要是在這兩部分吧,其實相較於音質,性能差距會比較明顯。


Naive,我們都調用Windows Media Foundation的API去播放,誰要自己解碼。


如果菜鳥調用解碼api 大牛自己擼,根據大牛的水平,我估計有九成的可能性菜鳥的音質比較好。


有影響

Foobar解碼的時候會直接調用自帶解碼器或插件。

我使用的PC沒有Win8.1音效卡驅動,所以只能強行安裝了一個另一個品牌不同型號的驅動,但是幾乎所有播放器播放有很大的雜音和破音

唯獨!Foobar!能正常播放!超神了!

PS:如果知識水平高到能對中國信息技術產業發展有著高瞻遠矚的見解,又能在大學時代精通樂器,寫出來的音樂播放器一定是最hou的(逃


嗨嗨嗨前面的你們光顧著水標題了,看一看人題目的補充內容啊。

先上結論,不同播放器(特別是定位高端的)之間很可能有差別。

[前排提示:本回答沒有聽感對比描述]
那些廢話我是不會寫的,一直很煩網上聲學設備討論里除去聲場等基本描述以外亂七八糟的各種說法,能試聽解決的咱們就試聽解決,試聽不到買不到買不起的你的詞藻再華麗我也聽不見,跟我說聽感好也是搞得我心裡癢( "-" )ノ)`-" )。so,好奇就自己聽聽看啊。

舉幾個栗子:
安卓平台的①網易雲音樂 ②PowerAMP ③Rockbox
Windows平台的④Windows Media Center⑤Foobar2000⑥HQPlayer
你可以試試看同一首44.1KHz/16bit/320kbps+的音樂在這幾個播放器下聽起來有什麼不同(同平台對比)。
理論上,播放器該乾的是傳輸的活,把音頻文件餵給解碼器就完事,什麼升頻調製數模轉換雜七雜八的一概別管,解碼器一看能DAC硬解咱們就統一走DAC,用不了就用同一套標準的軟解。這樣在不做EQ混響等處理的前提下輸出的模擬信號就沒差了,但是該說是大家喜歡重複造輪子好呢,還是對自己的演算法自信好呢(當然真·大神確實有這個實力自信),總之很多的播放器幹了解碼器部分/大部分的活,或者乾脆自己擼了一套解碼方案,直接包圓到模擬信號。其中實現又各不相同,這樣的情況下,最終輸出相同才是比較稀奇的。
不過最終輸出的聲音到底"好"還是"不好",就要看具體個人了。從這裡咱們就離開了科學範疇,進入了玄學領域。總之你愛聽哪個就聽哪個,多試多聽,適合自己就OK。

最後:哎呀升頻輸出DSD的HQPlayer肯定吊打老實喂解碼器的fb2k的,騷演算法騎臉怎麼輸嘛,騷操作不可能輸的,fb2k還要靠插件的一點都不自信,30塊地攤耳機都能吊著打,我是專業木耳不可能錯的(逃


Music Score &> Music Performance &> Recording Quality &> Mastering &> Storage Media &> Transport &> Digital to Analog Conversion &> Amplifier &> Headphone/Speakers. 錄音作品被欣賞的流程
事實上,有很大差別。
當然可能是產品架構的考慮
Nokia 當年用的S系統,自帶的播放器很塑料音。由於是智能機,所以同樣有許多app,像天天動聽等都是那時就有發軟體的。那個時候有一款音樂播放器叫Lcg Jukebox。

他家的軟體都是簡潔實用的。同樣的音樂在他家的產品就有更多的細節,即使它是調用了Nokia的硬體仍然比Nokia的優秀。他家論壇上曾經看到天天動聽到他家膜拜和推廣天天動聽 了。這個播放器出現以前他們先出了個免費的ultramp3
至於為什麼有的app就是更優秀我倒不是很清楚(假若知道我就自己編寫成產品賣錢了)iOS同樣有比幾大國內音樂巨頭優秀的播放器。Mac os 也有。amarra就是其中一個。

以下為 來自網路的文字
The confusion here, as with most people who』ve asked the same question over and over again, is simply the fact that having a character implies (wrongly) that they have applied some sort of an EQ. When you are only using one player, it』s easy to imagine that the player you use is neutral. When you use nine different players and really evaluate them over a long period of time, do you really believe that these nine players, created by different people, with different approaches to minimizing jitter and optimizing data transfer, with different coding, optimization methods and algorithms, will sound exactly the same?
The differences that I found between the different players need to be explained, and that』s what I tried to explain. It』s not that the different players applied an EQ so one player boosted the vocals, and the other boosted the bass. Some people who』s tried comparing the different players do notice the same differences such as Amarra having the blackest background, Audirvana being grainy, and so on.

Which one player is the most neutral of them all? Again, I think neutrality is easier to define in the realm of ideas, than in the real world. How do you define neutrality? What is the most neutral sound? If one player has a bigger soundstage, and the next player a smaller soundstage, does the one with the bigger soundstage get to claim to be the more neutral of the two? I honestly have no answer to these questions because it』s impossible to set a precise standard of neutrality in real life.

It』s like trying to measure length. Any of us can take a ruler to measure the the dimension of a book. You get the measurements, and you take the figure as the fact. When someone comes up with a second ruler and find a slight differences in the dimension, who gets to claim that his ruler is the most accurate one? Do you see the picture here? This is the same as with the apps. You use one and you think it』s quite neutral. You use two and find that the two apps have a slightly different sound. Which of the two is the neutral one?


一般像我這種菜逼,寫音樂播放器都是直接調用api的。

所以,除非個別大神音頻解碼技術可以超越谷歌寫音頻那個組,要不然大部分都沒啥區別。


你什麼時候產生了程序員都能寫音頻解碼器這樣的玩意的錯覺…


—— 一個隨口的破回答能別贊了么。。


會有差別,但是相比於火電/水電/核電的差別來說,不那麼明顯。

菜鳥程序員代碼毛躁,寫出來的程序內存碎片多,讀取速率不穩定,輸出時延會出現微小的抖動。第二是佔用 cpu 過高,增加了漂變的幾率,並且偶爾會發生過熱現象,此時音質就會出現「燥」的感覺。

但是,不建議聽友們糾結程序員問題,因為就日常聽感來說,由於設備和線材參差不齊,大部分家庭場景,都無法達到可以分辨程序員水平的程度。比如說,大部分聽友使用的線材,都是規格化產品,對於用料都沒有深刻的考究,微小的抖動和漂變都在傳輸過程中糊掉了。想做到鑒別程序員的程度,線材最好使用寧瑪派藏傳佛教上師加持過的藏銀打制,這種線材不僅有極高的還原度,更能打開遼闊的聲場,更有利於分辨程序員水平。

另外,儘管我們可以使用設備來還原程序員的編程細節,但是作為聽眾,最好還是不要下斷言為好。因為頂級程序員常常會使用一些特定的抖動和漂變來增加聲音的真實感,或者讓聲音出現一種特殊的「味道」,這是個人風格的一部分。審美畢竟是個人的事,對於不了解的東西,最好還是保存一份敬畏。

要說100%精確解碼還原,實際上 ai 比人類做的更好。現在已經有人使用深度神經網路訓練出 100% 絕對純凈還原的解碼器,但是這樣的還原是千篇一律的,缺少了人性的部分。這樣的聲音,值得聽一次,卻不值得聽一生。


放在二十年前可能是,現在不是了。

PS:foobar2k的作者是原先winamp的作者。。。


有的有區別,有的沒區別。至少iOS開發上沒區別。
核心代碼就五行,網上多的是,功能上大牛可能多點,但是音質什麼的都一樣。
因為核心代碼是蘋果封裝好了的!


剛好我在大學課程作業鼓搗過音樂播放程序,寫過兩個版本。

第一個版本基於winmm.lib庫,直接把文件名交給庫,庫為你完成整個播放過程。非常無腦,甚至算不上編程,跟直接用windows media player播放沒啥太大區別。

第二個版本基於一個開源的java mp3庫,需要自己通過buffer循環去一塊塊讀取解碼後的mp3數據,然後餵給播放庫。

這倆音質有沒差別我聽不出來,當時當我的筆記本磁碟或者cpu很繁忙的時候,第二個版本明顯的播放聲音就不連續了。


會,foobar就是現成的例子。

當年Windows下的神級音樂播放器,界面不忍直視,就憑音質這個硬功夫稱霸。現在我不怎麼用了,因為現在基本不用pc放音樂了。

它音質好的原因我沒有研究過,猜測可能在於它支持asio吧?(補充:評論區有亮點,參見評論區解釋。)


要是都使用同一個封裝好的介面或者解碼器的話,沒啥差別。頂多他比你UI好看點,性能好點,代碼優美點而已。要是大牛精通信號的處理和解碼器的實現的話那就有差別了。。


菜鳥就算了,大牛才開始有區別。

真正的大牛必須在語言層面優化播放器。

比如巴赫的曲目,那必須java來解,看似沉悶重複的曲調,卻漸漸深入靈魂,完全匹配java在不斷的getter setter中,迎來頓悟,領會思想的深處。

莫扎特,那必須是c++,厚重又不失輕靈,單調又不失詭變。

肖邦和ruby,那是天作之合,同樣的華麗優美,曲折奇巧,似非人間之物。

柴可夫斯基這種音部眾多,層層推進又錯落有致的,當然只有erlang最適合。

進行曲用go,狂想曲對scala,經典搭配。

當然,流行音樂同樣如此。

蔡琴適合java,倍增香醇濃厚。

陳奕迅只得lisp,更添鬼馬綺麗。

周杰倫最配delphi,天馬行空,骨子裡卻有一份傳統。

伍佰唯有php可解,同樣看似平民,卻不落窠臼,直抒胸臆。

羅大佑牽手fortran,都是於破敗簡陋之中顯出經典本色。

王菲絕配elixir,空幻輕靈,似天籟之音,惜乎從者小眾,最好版本的王菲不現人間久矣。

神曲brainfuck,爵士java,金屬rust,行業公認。

煙嗓也必須rust,搭配點銹味,後工業時代的頹廢凄美盡顯無疑。

rap不用python,你都找不到那個最佳節奏感。

評書 相聲 詩朗誦,不用node,你都體會不到那個抑揚頓挫。

實在不知道什麼最合適的,看歌曲時間,早於2000年用c,晚於用python。

還有一些是官方標準,比如tylor要是不搭swift,are you ok?

最完美的播放器我快要開發完成了。

當然,這麼多編譯器 解釋器 虛擬機啥的整合在一起,安裝包有幾十G那麼大。不過我想愛音樂的你定然不會介意。


推薦閱讀:

怎樣找到 IT 界的男朋友?
男,985計算機小碩一枚,去爭取演算法崗位還是開發崗位?
工作五年以上的程序員,應該幹些什麼?
如何在debug的同時保持溫柔屬性?
程序員的優越感從何而來?

TAG:音樂 | 程序員 | 編程 | 音樂播放器(軟體) | Hi-Fi |