- 大年初一 (2008年2月7日)
- 坐長榮 EVA 航空 5:15起飛, 7時到台北桃園國際機場。
- 坐一個多鐘頭旅遊巴到北投區浸溫泉。這是我第一次浸溫泉啊。根據導遊說,北投的溫泉,是碳酸溫泉,沒有什麼氣味的;聽他說還有一種硫磺溫泉,有些火柴的味道。這裡的溫泉,是分開一間一間房浸的。
我心中一直有一個疑團,究竟這裡的溫泉水,是地底冒出來的,還是用熱水開粉做出來的呢?
當然這些尷尬的問題,我也不會問啦。
- 之後又坐一個鐘頭旅遊車去九份。聽說是因為一齣電影「悲情城市」(梁朝偉演的),才弄得這裏很出名。這裡有很擁擠的巷子,有很多東西吃(什麼糕點、魚丸肉丸湯等),但老實說…我也不知道來這裡做什麼,沒有什麼好看的。聽聞真的要玩,要借宿一宵,之後看基隆市的日出;另外行到巷子的尾,有些類似指向行山徑的路牌 ,大概是可以行山吧。但那天下雨下得很大,而且逗留時間不長,所以在這裡吃了一個貢丸+麵湯,買些手信就走了。
- 之後 旅遊車到了台北火車站解散了,去城美大飯店 check in 房間。
- 黃昏時,在 7-11 買了 「悠遊卡」(即八達通卡) ,NT$500 (按金 $100,內存 $400),方便坐公車(即巴士)和捷運(即港鐵),然後去了龍山寺捷運站。
- 到了龍山寺附近的夜市吃東西。吃了 有抹茶條卷在上面的炸熱狗、蚵仔(即蠔仔)煎、蚵仔湯、85° (台灣 Starbuck 的對手)柚子茶 。
- 然後去龍山寺,人很多,非常虔誠。廟裡貢神明也多,例如:觀音菩薩、地藏菩薩、月老、文昌…共10多位。
- 大年初二 (2008 年 2 月 8 日)
- 11 時多坐捷運到淡水。淡水是由吃東西的巷 +吃東西的街道構成的市 (可能是假期才這樣吧,平時就不得而知)。在這裡吃了炸地瓜丸、鐵蛋(超彈牙滷水蛋)、「阿給」、魚丸(魚蛋)湯。「阿給」是日本油豆腐的音譯,其實是油豆腐中間挖空,填入粉絲,然後用類似鯪魚球漿的東西封口,再蒸熟,然後塗上甜辣醬。我覺得味道一般,不是特別好吃。 另外,我覺得「阿給」的英文音譯 arcade 譯得非常好!
另外,在這裡買了鼎鼎大名的「阿婆鐵蛋」。在「阿婆鐵蛋」附近,有很多什麼「阿伯鐵蛋」、「阿公鐵蛋」真會混淆視聽。
- 然後去了淡水紅毛城。紅毛城我的理解是以前西班牙人佔領淡水時起的建筑物,後來又給英國人佔領了,將那裡變成領事館。裡面有一個小小展覽館,展覽了航海的東西和後來英國領事館的歷史。尤其推介裡面播放的一個介紹淡水video。我看完才知道,淡水以前是台灣的重要港口,很多東西(茶葉等)都從台北島內內河運到淡水港口,然後運出到大陸沿海城市,乃至全世界。後來船的噸位越來越大,淡水港口漸漸不敷應用,逐漸變得沒那麼重要呢。
還有一點,「基隆」原名是「雞籠」! 將地方名從沒有那麼好聽的名改為好聽的,香港也有,例如「吊頸嶺」改為「調景嶺」。
- 由於時間尚早,又不知道坐什麼車好,所以就決定做做運動,步行去漁人碼頭(1小時)!我去之前, 沒有做功課,心中只是想,台灣是一個島,海鮮應該很多,什麼魚生都有得吃吧,漁人碼頭應該是個大魚市場之類的地方。去了才知道漁人碼頭什麼都沒有,只有一條情人橋。而且途中風大雨大,又冷,更把我的雨傘吹散了!
(淡水漁人碼頭籌建誌: 原來淡江的夕陽美景一直被譽為台灣八景之一,在落於此的淡水第二漁港,是漁人泊舟歸航之處,可惜漁港年久失修,髒亂傾頹。因此,自民國八十七年起,政府選定此處為多功能示範漁港,大力補助經費,台北縣政府積極規劃此處成為舟艇泊靠和大眾休閒的優質公園,並名為“淡水漁人碼頭”。另外,更加長了行人棧道,建徒步跨港橋,並經陳水扁總統於2003年2月14日情人節為跨港橋剪綵,命名為“情人橋”)
- 之後就去「士林觀光夜市」。裡面真係好誇張好多人。吃了 :
- 之後去「士林夜市」附近逛街,有些店舖的名字很有趣呢
- 11 時多坐捷運到淡水。淡水是由吃東西的巷 +吃東西的街道構成的市 (可能是假期才這樣吧,平時就不得而知)。在這裡吃了炸地瓜丸、鐵蛋(超彈牙滷水蛋)、「阿給」、魚丸(魚蛋)湯。「阿給」是日本油豆腐的音譯,其實是油豆腐中間挖空,填入粉絲,然後用類似鯪魚球漿的東西封口,再蒸熟,然後塗上甜辣醬。我覺得味道一般,不是特別好吃。 另外,我覺得「阿給」的英文音譯 arcade 譯得非常好!
- 大年初三(2008 年 2 月 9 日)
- 10 時多,坐捷運到動物園站。然後坐貓空纜車。人很多,但當局安排很好,流量頗快。可能是假期人多關係,車速調高了,明明排隊的標示說要等 150 分鐘,結果只排了大約70分鐘就已經可以登車。而且價錢不貴,從動物園站坐到貓空站,只需 NT$50 ,需時約 20 分鐘。不過,沿途一直狂下雨,外邊景色都看不清楚,只能隱約看到下面是茶田。上到山頂,天氣冷得要命,於是立即再排隊坐纜車下山。
後來在那裡派的宣傳單看到才知道,市府還規劃了四條旅遊行程:- 懷舊茶體驗
- 貓空親子樂
- 親山森林浴
- 品茗觀星夜
- 之後坐捷運去中正紀念堂站。這個捷運站真的與別不同,「中正紀念堂」幾個字有射燈射著啊。可能以前台灣人真是很尊重蔣中正(蔣介石)。
然後就去了「自由廣場」(即舊中正紀念堂)。下面的照片有一張 是在紀念堂外拍蔣介石銅像,但有很多無謂的裝飾擋住視線。看來台灣人真的不那麼尊重蔣介石了。
(香港以前有「九龍皇帝」專門塗鴉,原來台
北也有一個「台北皇帝」)
- 之後就坐捷運去士林站,坐的士去故宮博物館。裡面的藏品很精采呢!我去年去過北京的故宮,心中有一個疑團,為什麼那麼少古董珍藏在那裡呢? 直到今天才知道,那些古董都去了台灣啊。不過倒沒有什麼所謂,都是中國人地方。在故宮博物館裡,我租了一個 Audio Guide 機,我發覺真是很有用呢。以前我看那些古董展覽,通常看過便算,有什麼藝術價值,我都不是很清楚。但這次透過 Audio Guide 機介紹一些特選的展品,我才知道那些展品製作的難處,和怎樣欣賞呢。Audio Guide 機的國語不是太難明白的,我也聽懂 80-90%!我在這裡花了 3.5 小時。我也影了館內最珍貴的展品「翠玉白菜 」(哈哈哈...... 不過是在賣紀念品那裡拍的)
- 之後坐 巴士會士林夜市吃東西。這次吃了:
- 生煎飽 兩個 (菜的,不是肉的)
- 十全排骨 + 麵線
- 炸蟹肉丸
- 鹽酥雞
- 蘋果汁
- 10 時多,坐捷運到動物園站。然後坐貓空纜車。人很多,但當局安排很好,流量頗快。可能是假期人多關係,車速調高了,明明排隊的標示說要等 150 分鐘,結果只排了大約70分鐘就已經可以登車。而且價錢不貴,從動物園站坐到貓空站,只需 NT$50 ,需時約 20 分鐘。不過,沿途一直狂下雨,外邊景色都看不清楚,只能隱約看到下面是茶田。上到山頂,天氣冷得要命,於是立即再排隊坐纜車下山。
- 大年初四 (2008年 2 月 10 日)
- 之後坐捷運去忠孝 新生,去看電腦街,可惜很多店都沒有開。
- 然後坐捷運回西門。在西門徒步區走。西門徒步區有很多商店(很像香港銅鑼灣、旺角),而且還有樂隊在台上表演呢(當日表演的是強辯樂隊 - 四個娘娘腔的年輕人)。吃了:
- 臭豆腐
- 沙威瑪 (炒烤好的雞肉碎 + 洋蔥之類 的飽) + 起司(cheese)
- 冬菇肉丸湯 + 冬粉(即粉絲)
- 珍珠奶茶
在這裡,香港的電影似乎有一點吸引力,幾乎所有戲院都在做「長江七號」呢 !
由於雙腿太累,所以去看一齣電影「蓋世奇才」(Charlie Wilson's War),故事是說蘇聯共產黨當時入侵了阿富汗,在阿富汗肆意殺戮平民(美國的觀點),一個美國議員(Tom Hans 飾演),怎樣說服美國政府撥款,提供武器給阿富汗人民抵抗蘇聯的入侵。(不過後來引來了宗教狂熱份子來 如塔利班等搞到一塌糊塗) - 之後突然驚覺手信(台稱: 伴手禮)不夠,於是很慌張的找那裡可以找到「鳳梨酥」,找了很久都沒有。最後在台北捷運站的「三越」百貨的地下2樓找到!
- 之後就從飯店坐的士去台北桃園國際機場.。
- 之後坐捷運去忠孝 新生,去看電腦街,可惜很多店都沒有開。
本來這個blog是記錄開發輸入法的點滴的,後來越來越雜,現在什麼都記錄了。
2008年2月11日 星期一
鼠年新年(2008) 台北之旅
鼠年(2008)台北自由行行程 行程
2007年12月28日 星期五
好笑的翻譯:
好笑的翻譯:
| 1. | Fuck to fry the cow river | 干燒牛河 | Braised beef and flat noodles |
| 2. | Top soup cloud swallows | 上湯雲吞 | Wonton in soup |
| 3. | Black winter in type seafood soup in day | 日式海鮮湯烏冬 | Japanese Udon with Seafood soup |
| 4. | Western fashion fried rice | 西式炒飯 | Fried rice (Western Style). |
| 5. | The pig picks the noodle soup | 豬扒湯麵 (註: 扒手 =pick pocket) | Pork Chop & Noodles in soup |
| 6. | The black cow silk fries the idea powder | 黑椒牛柳絲炒意粉 | Scrambled beef fillet and Pasta with black pepper |
| 7. | Three silk soup idea powder | 三絲湯意粉 | Meat, Black fungus, Carrots & Pasta (Spaghetti) in soup |
| 8. | The cold cow in west in special grade picks | 特級西冷牛扒 | Superfine Portioned Striploin Steaks. |
| 9. | Pearl eight claw fish | 珍珠八爪魚 | Maize and bamboo shoot and octopus |
| 10. | The water is as well | 滷水掌亦 | Brined duck foot |
| 11. | The week beats the fish soup | 周打魚湯 | Fish Chowder |
| 12. | Elder brother the ground is second coffee | 哥倫地亞咖啡 | Columbia Coffee |
| 13. | The chicken hates the soup of | 雞茸忌廉湯 | Chinken and Cream Cheese soup |
| 14. | Follow butter meal pack | 跟牛油餐包 | Butter Dinner Rolls |
| 15. | Swallow to take the fish sand | 吞拿魚沙律 | Tuna Salad |
| 16. | Butter many privates | 牛油多士 | Toast w/Butter |
| 17. | Company three texts cure | 扒芝士火腿三文治 | Cheese and Ham Sandwiches |
| 18. | Living to fry the beef rice | 生炒牛肉飯 | Fried beef and rices |
| 19. | Nepoleon fries the idea powder | 拿破倫炒意粉 | Spaghetti Neapolitan |
| 20. | Day type many spring fish | 日式多春魚 | Japanese Karafuto-shishamo, Capelin |
2007年12月23日 星期日
冬至究竟什麼?
今天食了一頓很豐富的冬至飯。之後在思考,究竟有多少人了解什麼是冬至呢?
如果要我向人解釋,我應該怎樣解釋呢?
要解釋冬至,單憑寫篇文章,甚至加插圖,都是很難令人明白。一定是要用動畫。
另外,要解釋冬至,必須先解釋四季的成因。要解釋四季的成因,就必須要有地球軌跡的圖。
但怎樣顯示一個在同時自轉 又同時圍繞太陽公轉的地球呢? 於是就從網上找,找到了這個網站:
http://parentnode.org/flash/flash-3d-earth-including-fla/
但都不合用,我只用了他裡面的圖,動手自己做一個自轉的地球(加了點 Action Script)
材料夠了,就動手寫了以下這個「四季」的小movie clip, 告訴大家 四季的來由。希望大家喜歡喇。
如果要我向人解釋,我應該怎樣解釋呢?
要解釋冬至,單憑寫篇文章,甚至加插圖,都是很難令人明白。一定是要用動畫。
另外,要解釋冬至,必須先解釋四季的成因。要解釋四季的成因,就必須要有地球軌跡的圖。
但怎樣顯示一個在同時自轉 又同時圍繞太陽公轉的地球呢? 於是就從網上找,找到了這個網站:
http://parentnode.org/flash/flash-3d-earth-including-fla/
但都不合用,我只用了他裡面的圖,動手自己做一個自轉的地球(加了點 Action Script)
材料夠了,就動手寫了以下這個「四季」的小movie clip, 告訴大家 四季的來由。希望大家喜歡喇。
2007年12月14日 星期五
數碼電視廣播的原因!
最近在思考為什麼香港政府(乃至全世界政府)要推行地面數字電視廣播。
大家有一個錯覺,推行數字電視廣播的主要原因,是為了高清,多聲道等更高的視覺和聽覺享受,其實這些只是數字電視帶來的副產品。我個人認為背後的原因都是為了$。
目前的模擬多頻道廣播,其實是很浪費頻譜的,就以翡翠台為例,各發射站播放翡翠台的頻率如下:
(資料來源電訊管理局:http://www.ofta.gov.hk/zh/freq-spec/tvbnet.pdf)
從表中可以看到,為了播放一個翡翠台,浪費了13個電視頻道。大家不禁要問,為甚麼不全香港播放翡翠台都用同一個頻道呢?答案:
假設你住的地方在慈雲山與飛鵝山中間的地帶,而兩發射站都用同一頻率發射翡翠台,由於訊號由發射站到你的電視天線時間不同,就會發生「鬼影」現象。所以不同發射站要不同頻率,而你因應你住的地方,選擇某個發射站的訊號。
新的數字電視頻率如下:(http://www.ofta.gov.hk/zh/report-paper-guide/guidance-notes/gn_200705_tc_.pdf)
舉例:從表中看到,無線翡翠台的數碼廣播頻道,全港九都是一樣的,只有一個頻率。那為什麼又不會有「鬼影」的問題呢?
因為數字電視接收器,其中一個最重要的部分,就是消除主要訊號外的「鬼影」。這些「鬼影」可能是由於是其他山頭的訊號反射或來自其他發射站發出的訊號。
這些數字電視技術,都是近10-20年發展出來的。美國最先使用數字電視廣播
ATSC ,歐洲地方用的 DVB-T,日本用 ISDB-T。本來香港是採用
DVB-T 的,但原來每買一架這些歐洲制式的電視接收機,就要附很多專利費用給歐洲公司。每年這樣被敲詐數以百億元專利費,真是令人心有不甘。
後來中國政府自己開發了一套 DMB-TH 制式,而且規定2007年強制執行。香港於是也決定也採用DMB-TH,避免了歐洲的大量專利費(雖然仍有一部分用於
視頻音頻編碼 MPEG2, H.264上),而且幫助中國推行自主研發的技術,這個決定可謂維護了民族尊嚴和利益。
話說回頭,為什麼推行數碼廣播是為了 $ 呢?
原來數碼廣播一旦推行,而模擬廣播逐漸結束,很多頻譜便閒置了。這些頻譜可以用作很多很多其他用途,例如手提電話,無線寬頻上網、移動電視、3G等東西。一個頻譜可以賣得過千億元的,最令人津津樂道的莫過於李嘉誠千億賣橙。
所有政府和福利機構,對這些收入都虎視眈眈的。 這就是政府推行數字電視廣播最深層的原因!
大家有一個錯覺,推行數字電視廣播的主要原因,是為了高清,多聲道等更高的視覺和聽覺享受,其實這些只是數字電視帶來的副產品。我個人認為背後的原因都是為了$。
目前的模擬多頻道廣播,其實是很浪費頻譜的,就以翡翠台為例,各發射站播放翡翠台的頻率如下:
(資料來源電訊管理局:http://www.ofta.gov.hk/zh/freq-spec/tvbnet.pdf)
電視 | 電視 頻道 | 視頻 (MHz) | 聲頻 (MHz) | 有效 輻射功率 (W) | 極化 | 偏置 |
| 慈雲山 | 21 | 471.25 | 477.25 | 10,000 | H | 0flNP |
| 青山 | 34 | 575.25 | 581.25 | 1,000 | H | +5/3flNP |
| 飛鵝山 | 34 | 575.25 | 581.25 | 1,000 | H | -5/3flNP |
| 金山 | 33 | 567.25 | 573.25 | 1,000 | H | 0flNP |
| 九龍坑山 | 49 | 695.25 | 701.25 | 1,000 | H | 0flNP |
| 南丫島 | 49 | 695.25 | 701.25 | 1,500 | V | -5/3flNP |
| 赤柱 | 34 | 575.25 | 581.25 | 100 | H | 0flNP |
| 南朗山 | 33 | 567.25 | 573.25 | 100 | H | +5/3flNP |
| 砵甸乍山 | 33 | 567.25 | 573.25 | 100 | H | +5/3flNP |
| 柴灣 | 48 | 687.25 | 693.25 | 100 | H | +5/3flNP |
| 聶高信山 | 48 | 687.25 | 693.25 | 100 | V | -5/3flNP |
| 琵琶山 | 49 | 695.25 | 701.25 | 100 | H | +5/3flNP |
| 照鏡環山 | 49 | 695.25 | 701.25 | 0.5 | H | 0flNP |
從表中可以看到,為了播放一個翡翠台,浪費了13個電視頻道。大家不禁要問,為甚麼不全香港播放翡翠台都用同一個頻道呢?答案:
假設你住的地方在慈雲山與飛鵝山中間的地帶,而兩發射站都用同一頻率發射翡翠台,由於訊號由發射站到你的電視天線時間不同,就會發生「鬼影」現象。所以不同發射站要不同頻率,而你因應你住的地方,選擇某個發射站的訊號。
新的數字電視頻率如下:(http://www.ofta.gov.hk/zh/report-paper-guide/guidance-notes/gn_200705_tc_.pdf)
| 頻道名稱 | 電視頻道 | 頻道(MHz) 注意:未確定 筆者自己作的 | 電視發射站 地點 |
| 亞視本港台 | 11 | 119.25 | 慈雲山 2007年 |
| 亞視新聞財經頻道 | 12 | 126.25 | |
| 亞視動感資訊頻道 | 13 | 133.25 | |
| 亞視魅力資訊頻道 | 14 | 140.25 | |
| 亞視文化資訊頻道 | 15 | 147.25 | |
| 亞視國際台 | 16 | 154.25 | |
| aTV高清頻道 | 19 | 175.25 | |
| 無線資訊頻道 | 80 | 647.25 | |
| 無線翡翠台 | 81 | 655.25 | |
| 無線翡翠2台 | 82 | 663.25 | |
| 無線明珠台 | 83 | 671.25 | |
| 無線高清翡翠台 | 88 | 711.25 |
舉例:從表中看到,無線翡翠台的數碼廣播頻道,全港九都是一樣的,只有一個頻率。那為什麼又不會有「鬼影」的問題呢?
因為數字電視接收器,其中一個最重要的部分,就是消除主要訊號外的「鬼影」。這些「鬼影」可能是由於是其他山頭的訊號反射或來自其他發射站發出的訊號。
這些數字電視技術,都是近10-20年發展出來的。美國最先使用數字電視廣播
ATSC ,歐洲地方用的 DVB-T,日本用 ISDB-T。本來香港是採用
DVB-T 的,但原來每買一架這些歐洲制式的電視接收機,就要附很多專利費用給歐洲公司。每年這樣被敲詐數以百億元專利費,真是令人心有不甘。
後來中國政府自己開發了一套 DMB-TH 制式,而且規定2007年強制執行。香港於是也決定也採用DMB-TH,避免了歐洲的大量專利費(雖然仍有一部分用於
視頻音頻編碼 MPEG2, H.264上),而且幫助中國推行自主研發的技術,這個決定可謂維護了民族尊嚴和利益。
話說回頭,為什麼推行數碼廣播是為了 $ 呢?
原來數碼廣播一旦推行,而模擬廣播逐漸結束,很多頻譜便閒置了。這些頻譜可以用作很多很多其他用途,例如手提電話,無線寬頻上網、移動電視、3G等東西。一個頻譜可以賣得過千億元的,最令人津津樂道的莫過於李嘉誠千億賣橙。
所有政府和福利機構,對這些收入都虎視眈眈的。 這就是政府推行數字電視廣播最深層的原因!
2007年12月11日 星期二
擷取 音樂的方法
最近我被要求擷取某網站的背景音樂,該網站十分狡猾,如果你用 Windows Media Player 去開啟以下的link: http://m2.colorme.com.cn/ftp/l/l/h/8/llh8/music/1168884738897.wma 《滇聆》雪境,可以收聽的,但用其他方法下載該音樂,它卻回應一些無關痛癢的網頁。結果我要寫下面的程式,去扮「我是音樂播放器」才能下載 :
編譯: gcc -l curl -o test test.c
用法: ./test http://m2.colorme.com.cn/ftp/l/l/h/8/llh8/music/1168884738897.wma > /tmp/1.wma
程式碼如下
#include
#include
#include
#include
#include
#include
#define ICY_METAINT "icy-metaint:"
static int metaint, metacnt, metalen_left;
static int load_from_net_so_far;
// If it is 8192, you always get 8192 bytes of real data, followed by the metadata.
// The meta data format is mlength (1 byte), followed by string (variable length).
// The length of the string is the mlength multiplied by 16.
// So when there is no metadata, you'll get a single byte (mlength=0).
static int
head_write_callback(void *buffer, size_t size, size_t nmemb, void *stream) {
int size_to_write=size*nmemb;
char *p;
fwrite(buffer, size, nmemb, stderr);
if ((p=strstr(buffer, ICY_METAINT))!=NULL) {
metaint=atoi(p+strlen(ICY_METAINT));
}
return size_to_write;
}
static int
play_audio(char *buffer, size_t size, size_t nmemb, void *stream) {
fwrite(buffer, size, nmemb, stdout);
load_from_net_so_far+=size*nmemb;
fprintf(stderr, "\b\b\b\b\b\b\b\b\b\b%010d", load_from_net_so_far);
return size*nmemb;
}
int
main(int argc, char **argv) {
CURL *curl=NULL;
CURLcode ret;
struct curl_slist *headerlist = NULL;
struct curl_slist *aliases = NULL; // Yick_2003_12_29
char *url;
if (argc!=2) {
fprintf(stderr, "%s url\n", argv[0]);
fprintf(stderr, "where url can be a playlist or mp3 url\n");
fprintf(stderr, "the song will appear at stdout\n");
fprintf(stderr, "%s \"http://www.shoutcast.com/sbin/shoutcast-playlist.pls?rn=911919&file=filename.pls\" &\n", argv[0]);
fprintf(stderr, "%s \"http://www.shoutcast.com/sbin/shoutcast-playlist.pls?rn=1704&file=filename.pls\" &\n", argv[0]);
fprintf(stderr, "%s \"http://m2.colorme.com.cn/ftp/l/l/h/8/llh8/music/1168884738897.wma\" 1> /tmp/1.wma \n", argv[0]);
return -1;
}
url=argv[1];
metaint=8192;
metacnt=0;
metalen_left=0;
load_from_net_so_far=0;
curl = curl_easy_init();
headerlist = curl_slist_append(headerlist, "Pragma: stream-switch-entry=ffff:1:0");
headerlist = curl_slist_append(headerlist, "Pragma: stream-switch-count=1");
headerlist = curl_slist_append(headerlist, "Pragma: xClientGUID={71F1B2A2-87F5-11D5-A064-0050DA8DAD15}");
headerlist = curl_slist_append(headerlist, "Pragma: xPlayStrm=1");
headerlist = curl_slist_append(headerlist, "Pragma: no-cache,rate=1.000000,request-context=2");
headerlist = curl_slist_append(headerlist, "Icy-MetaData: 1");
headerlist = curl_slist_append(headerlist, "Accept: */*");
headerlist = curl_slist_append(headerlist, "Accept-Encoding: deflate");
headerlist = curl_slist_append(headerlist, "Connection: keep-alive");
headerlist = curl_slist_append(headerlist, "TE: trailers,deflate");
aliases = curl_slist_append(aliases, "ICY 200 OK" );
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_USERAGENT, "NSPlayer/4.1.0");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
curl_easy_setopt(curl, CURLOPT_FAILONERROR, 1);
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
curl_easy_setopt(curl, CURLOPT_HTTP200ALIASES, aliases);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, play_audio);
curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, head_write_callback);
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 5);
ret=curl_easy_perform(curl);
if (load_from_net_so_far) {
fprintf(stderr, "audio ended\n");
goto SRC_SHOUTCAST_THREAD_FN_LBL;
} else {
fprintf(stderr, "Error in opening url %s\n", url);
}
curl_easy_cleanup(curl);
curl=NULL;
}
SRC_SHOUTCAST_THREAD_FN_LBL:
if (curl)
curl_easy_cleanup(curl);
return NULL;
}
編譯: gcc -l curl -o test test.c
用法: ./test http://m2.colorme.com.cn/ftp/l/l/h/8/llh8/music/1168884738897.wma > /tmp/1.wma
程式碼如下
#include
#include
#include
#include
#include
#include
#define ICY_METAINT "icy-metaint:"
static int metaint, metacnt, metalen_left;
static int load_from_net_so_far;
// If it is 8192, you always get 8192 bytes of real data, followed by the metadata.
// The meta data format is mlength (1 byte), followed by string (variable length).
// The length of the string is the mlength multiplied by 16.
// So when there is no metadata, you'll get a single byte (mlength=0).
static int
head_write_callback(void *buffer, size_t size, size_t nmemb, void *stream) {
int size_to_write=size*nmemb;
char *p;
fwrite(buffer, size, nmemb, stderr);
if ((p=strstr(buffer, ICY_METAINT))!=NULL) {
metaint=atoi(p+strlen(ICY_METAINT));
}
return size_to_write;
}
static int
play_audio(char *buffer, size_t size, size_t nmemb, void *stream) {
fwrite(buffer, size, nmemb, stdout);
load_from_net_so_far+=size*nmemb;
fprintf(stderr, "\b\b\b\b\b\b\b\b\b\b%010d", load_from_net_so_far);
return size*nmemb;
}
int
main(int argc, char **argv) {
CURL *curl=NULL;
CURLcode ret;
struct curl_slist *headerlist = NULL;
struct curl_slist *aliases = NULL; // Yick_2003_12_29
char *url;
if (argc!=2) {
fprintf(stderr, "%s url\n", argv[0]);
fprintf(stderr, "where url can be a playlist or mp3 url\n");
fprintf(stderr, "the song will appear at stdout\n");
fprintf(stderr, "%s \"http://www.shoutcast.com/sbin/shoutcast-playlist.pls?rn=911919&file=filename.pls\" &\n", argv[0]);
fprintf(stderr, "%s \"http://www.shoutcast.com/sbin/shoutcast-playlist.pls?rn=1704&file=filename.pls\" &\n", argv[0]);
fprintf(stderr, "%s \"http://m2.colorme.com.cn/ftp/l/l/h/8/llh8/music/1168884738897.wma\" 1> /tmp/1.wma \n", argv[0]);
return -1;
}
url=argv[1];
metaint=8192;
metacnt=0;
metalen_left=0;
load_from_net_so_far=0;
curl = curl_easy_init();
headerlist = curl_slist_append(headerlist, "Pragma: stream-switch-entry=ffff:1:0");
headerlist = curl_slist_append(headerlist, "Pragma: stream-switch-count=1");
headerlist = curl_slist_append(headerlist, "Pragma: xClientGUID={71F1B2A2-87F5-11D5-A064-0050DA8DAD15}");
headerlist = curl_slist_append(headerlist, "Pragma: xPlayStrm=1");
headerlist = curl_slist_append(headerlist, "Pragma: no-cache,rate=1.000000,request-context=2");
headerlist = curl_slist_append(headerlist, "Icy-MetaData: 1");
headerlist = curl_slist_append(headerlist, "Accept: */*");
headerlist = curl_slist_append(headerlist, "Accept-Encoding: deflate");
headerlist = curl_slist_append(headerlist, "Connection: keep-alive");
headerlist = curl_slist_append(headerlist, "TE: trailers,deflate");
aliases = curl_slist_append(aliases, "ICY 200 OK" );
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_USERAGENT, "NSPlayer/4.1.0");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
curl_easy_setopt(curl, CURLOPT_FAILONERROR, 1);
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
curl_easy_setopt(curl, CURLOPT_HTTP200ALIASES, aliases);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, play_audio);
curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, head_write_callback);
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 5);
ret=curl_easy_perform(curl);
if (load_from_net_so_far) {
fprintf(stderr, "audio ended\n");
goto SRC_SHOUTCAST_THREAD_FN_LBL;
} else {
fprintf(stderr, "Error in opening url %s\n", url);
}
curl_easy_cleanup(curl);
curl=NULL;
}
SRC_SHOUTCAST_THREAD_FN_LBL:
if (curl)
curl_easy_cleanup(curl);
return NULL;
}
訂閱:
文章 (Atom)
