React Native封裝音樂播放器組件

前言

音樂播放器Demo是作者的開源項目OneM中的一個功能趋观,這里作者把播放器功能獨立出來,方便需要的同學參考學習皱坛。

預覽效果圖

gif

Demo源碼地址

https://github.com/guangqiang-liu/react-native-audio-demo

播放器支持功能

  • 支持播放 \ 暫停
  • 支持三種播放模式豆巨,單曲循環(huán)、循序播放往扔、隨機播放
  • 支持切換上一首、下一首
  • 支持一首音頻播放完成自動切換下一首
  • 支持緩存播放及緩存進度
  • 支持播放進度拖拽到指定位置播放

使用到的技術點

  • 項目使用到react-native-video媒體播放組件
  • 項目中用到的圖標都是IconFont字體react-native-vector-icons萍膛,以及自定義的字體庫
  • 播放器背景使用了高斯模糊效果,使用到react-native-blur組件

react-native-video 組件使用講解

<Video source={{uri: "background"}}   // Can be a URL or a local file.
       ref={(ref) => {
         this.player = ref
       }}                                      // Store reference
       rate={1.0}                              // 0 is paused, 1 is normal.
       volume={1.0}                            // 0 is muted, 1 is normal.
       muted={false}                           // Mutes the audio entirely.
       paused={false}                          // Pauses playback entirely.
       resizeMode="cover"                      // Fill the whole screen at aspect ratio.*
       repeat={true}                           // Repeat forever.
       playInBackground={false}                // Audio continues to play when app entering background.
       playWhenInactive={false}                // [iOS] Video continues to play when control or notification center are shown.
       ignoreSilentSwitch={"ignore"}           // [iOS] ignore | obey - When 'ignore', audio will still play with the iOS hard silent switch set to silent. When 'obey', audio will toggle with the switch. When not specified, will inherit audio settings as usual.
       progressUpdateInterval={250.0}          // [iOS] Interval to fire onProgress (default to ~250ms)
       onLoadStart={this.loadStart}            // Callback when video starts to load
       onLoad={this.setDuration}               // Callback when video loads
       onProgress={this.setTime}               // Callback every ~250ms with currentTime
       onEnd={this.onEnd}                      // Callback when playback finishes
       onError={this.videoError}               // Callback when video cannot be loaded
       onBuffer={this.onBuffer}                // Callback when remote video is buffering
       onTimedMetadata={this.onTimedMetadata}  // Callback when the stream receive some metadata
       style={styles.backgroundVideo} />
       

Android拓展用法

<Video source={{uri: "background", mainVer: 1, patchVer: 0}} // Looks for .mp4 file (background.mp4) in the given expansion version.
       rate={1.0}                   // 0 is paused, 1 is normal.
       volume={1.0}                 // 0 is muted, 1 is normal.
       muted={false}                // Mutes the audio entirely.
       paused={false}               // Pauses playback entirely.
       resizeMode="cover"           // Fill the whole screen at aspect ratio.
       repeat={true}                // Repeat forever.
       onLoadStart={this.loadStart} // Callback when video starts to load
       onLoad={this.setDuration}    // Callback when video loads
       onProgress={this.setTime}    // Callback every ~250ms with currentTime
       onEnd={this.onEnd}           // Callback when playback finishes
       onError={this.videoError}    // Callback when video cannot be loaded
       style={styles.backgroundVideo} />

詳細的react-native-video使用方法請參照官方文檔:https://github.com/react-native-community/react-native-video

使用 react-native-video 組件操作步驟

  • npm install react-native-video --save
  • react-native link react-native-video --save

react-native-video 組件使用注意點

  • 最好是網(wǎng)絡請求到播放資源后在渲染 Video 組件
render() {
    const data = this.state.musicInfo || {}
    return (
      data.url ?
        <View style={styles.container}>
          <Image
            ref={(img) => { this.backgroundImage = img}}
            style={styles.bgContainer}
            source={{uri: data.cover}}
            resizeMode='cover'
            onLoadEnd={() => this.imageLoaded()}
          />
          <View style={styles.bgContainer}>
            {
              Platform.OS === 'ios' ?
                <VibrancyView
                  blurType={'light'}
                  blurAmount={20}
                  style={styles.container}/> :
                <BlurView
                  style={styles.absolute}
                  viewRef={this.state.viewRef}
                  blurType="light"
                  blurAmount={10}
                />
            }
          </View>
          {this.renderPlayer()}
        </View> : <View/>
    )
  }
  
  • 播放CD膠盤旋轉動畫有bug蝌戒,后續(xù)修復
  • 切換音樂時,有白屏情況瓶颠,后期修復
  • 注意 this.setTime()函數(shù)的使用刺桃,因為此函數(shù)調用頻率很高。
  • 注意播放器的各種狀態(tài)機瑟慈,處理好狀態(tài)機的更新時機

播放器Demo源碼地址

https://github.com/guangqiang-liu/react-native-audio-demo

項目中使用到的高斯模糊和IconFont功能請參考下面的技術文檔

總結

音樂播放器的功能實現(xiàn)還算是不太麻煩,很多功能 react-native-video 組價已經(jīng)幫我們封裝的很完善了葛碧,我們只需要調用即可借杰。同學們在開發(fā)音頻播放功能時蔗衡,可能會遇到其他的問題,這時同學們好好查看官方文檔绞惦。感覺文章對你有幫助,請 給個 star 給個 關注 謝謝济蝉。

福利時間

  • 作者React Native開源項目OneM地址(按照企業(yè)開發(fā)標準搭建框架設計開發(fā)):https://github.com/guangqiang-liu/OneM (歡迎小伙伴們 star)
  • 作者簡書主頁:包含50多篇RN開發(fā)相關的技術文章http://www.reibang.com/u/023338566ca5 (歡迎小伙伴們:多多關注菠发,多多點贊)
  • 作者React Native QQ技術交流群:620792950 歡迎小伙伴進群交流學習
  • 友情提示:在開發(fā)中有遇到RN相關的技術問題王滤,歡迎小伙伴加入交流群(620792950)滓鸠,在群里提問、互相交流學習哥力。交流群也定期更新最新的RN學習資料給大家,謝謝支持寞射!
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末锌钮,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子梁丘,更是在濱河造成了極大的恐慌旺韭,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掏觉,死亡現(xiàn)場離奇詭異,居然都是意外死亡织盼,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門沥邻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來羊娃,“玉大人唐全,你說我怎么就攤上這事蕊玷。” “怎么了垃帅?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我窗宦,道長赦颇,這世上最難降的妖魔是什么赴涵? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮髓窜,結果婚禮上,老公的妹妹穿的比我還像新娘寄纵。我一直安慰自己,他們只是感情好程拭,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著恃鞋,像睡著了一般亦歉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上肴楷,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天荠呐,我揣著相機與錄音,去河邊找鬼直秆。 笑死濒募,一個胖子當著我的面吹牛圾结,可吹牛的內容都是我干的。 我是一名探鬼主播筝野,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼歇竟,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了焕议?” 一聲冷哼從身側響起宝磨,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤唤锉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后窿祥,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡晒衩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年墙歪,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片箱亿。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出菠赚,到底是詐尸還是另有隱情,我是刑警寧澤衡查,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布必盖,位于F島的核電站,受9級特大地震影響歌粥,放射性物質發(fā)生泄漏。R本人自食惡果不足惜失驶,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嬉探。 院中可真熱鬧,春花似錦涩堤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽垮抗。三九已至,卻和暖如春碧聪,著一層夾襖步出監(jiān)牢的瞬間逞姿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工捆等, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人栋烤。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像明郭,于是被迫代替她去往敵國和親丰泊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內容

  • 前言 videoPlayer視頻播放器Demo是從作者前段時間開源的RN項目OneM中抽離出來的獨立的Demo示例...
    光強_上海閱讀 10,502評論 12 22
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,071評論 25 707
  • 簡短說明 收錄一些好用的RN第三方組件,以方便日常的使用亏推,大家有什么推薦的也可以跟我說,我加進去吞杭。如有冒犯,可以聯(lián)...
    以德扶人閱讀 43,635評論 44 214
  • 一粒糯米的旅程之第五步和第六步工序——涼飯和過水。 經(jīng)過上甑后患朱,生米已煮成熟飯,一粒粒糯米的狀態(tài)是膨脹脹熱乎乎的。...
    十五道閱讀 579評論 0 0
  • 本來昨天應該繼續(xù)感恩柔昼,但又覺得生活一地雞毛,好像無恩可感捕透。早上桂玲姐妹分享自己的智慧存款,說乙嘀,可以多多贊美感恩自己...
    飄藍_e78c閱讀 161評論 1 0