# react-native-dlna-player **Repository Path**: uking/react-native-dlna-player ## Basic Information - **Project Name**: react-native-dlna-player - **Description**: No description available - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2025-03-13 - **Last Updated**: 2025-11-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # react-native-dlna-player DLNA视频播放器,支持Android和iOS投屏功能 ## 功能特点 - 支持Android设备使用DLNA协议投屏 - 支持iOS设备使用AirPlay投屏 - 支持搜索、连接、断开设备 - 支持播放、暂停、恢复、停止视频 - 支持跳转到指定位置 - 支持获取播放状态 - 支持设置音量和静音 - 高可用、高定制、兼容性好 - 提供完善的错误处理机制 ## 安装 ```sh npm install react-native-dlna-player # 或 yarn add react-native-dlna-player ``` ### Expo 支持 从 0.7.0 版本开始,本库支持在 Expo 项目中使用。在 Expo 项目中使用时,请按照以下步骤进行配置: #### 安装 ```sh expo install react-native-dlna-player ``` #### 配置 在 Expo 项目的 `app.config.js` 或 `app.json` 中添加插件配置: **app.config.js 示例:** ```js const { withDlnaPlayer } = require('react-native-dlna-player'); module.exports = ({ config }) => { // 您的基本配置... return withDlnaPlayer(config); }; ``` **app.json 示例:** ```json { "expo": { "name": "您的应用名称", "plugins": [ "react-native-dlna-player" ] } } ``` 这将自动为您的应用添加所需的权限和配置。 #### 重要说明 - 在 Expo 开发模式下,DLNA/AirPlay 功能可能会受到限制。建议使用 Expo 开发构建(Development Build)或 EAS 构建进行测试。 - 确保 Expo SDK 版本 ≥ 45.0.0。 ### Android 配置 在 `android/app/src/main/AndroidManifest.xml` 中添加以下权限: ```xml ``` ### iOS 配置 在 `ios/Podfile` 中添加: ```ruby pod 'react-native-dlna-player', :path => '../node_modules/react-native-dlna-player' ``` 然后运行: ```sh cd ios && pod install ``` ## API 说明 本库提供了一套标准的API,用于DLNA设备的发现、连接和控制。所有方法都通过`DlnaPlayer`对象导出。 > **重要说明**:从0.2.0版本开始,我们统一了API设计,推荐使用以下标准API。旧版API仍然可用,但在未来版本中可能会移除。 ### 标准API(推荐使用) ```typescript // 导入库 import DlnaPlayer, { Device, PlaybackStatus, DlnaPlayerEventType } from 'react-native-dlna-player'; // 搜索设备 const searchDevices = async () => { try { const devices = await DlnaPlayer.searchDevices(); console.log('发现设备:', devices); } catch (error) { console.error('搜索设备失败:', error); } }; // 连接设备 const connectToDevice = async (deviceId) => { try { const connected = await DlnaPlayer.connectToDevice(deviceId); console.log('连接状态:', connected ? '已连接' : '连接失败'); } catch (error) { console.error('连接设备失败:', error); } }; // 播放视频 const playVideo = async (url, title) => { try { const played = await DlnaPlayer.playVideo(url, title); console.log('播放状态:', played ? '已开始播放' : '播放失败'); } catch (error) { console.error('播放视频失败:', error); } }; // 暂停、恢复、停止 await DlnaPlayer.pauseVideo(); await DlnaPlayer.resumeVideo(); await DlnaPlayer.stopVideo(); // 跳转到指定位置(秒) await DlnaPlayer.seekTo(120); // 获取播放状态 const status = await DlnaPlayer.getPlaybackStatus(); // 设置音量(0-100) await DlnaPlayer.setVolume(80); // 获取音量 const volume = await DlnaPlayer.getVolume(); // 设置静音 await DlnaPlayer.setMute(true); // 检查权限 const permissionResult = await DlnaPlayer.checkPermissions(); // 请求权限 const granted = await DlnaPlayer.requestPermissions(); // 监听事件 const subscription = DlnaPlayer.addEventListener( DlnaPlayerEventType.DEVICE_FOUND, (device) => { console.log('发现新设备:', device); } ); // 移除事件监听 DlnaPlayer.removeEventListener(subscription); ``` ## 使用方法 ```javascript import DlnaPlayer from 'react-native-dlna-player'; // 搜索设备 const searchDevices = async () => { try { const devices = await DlnaPlayer.searchDevices(); console.log('发现设备:', devices); return devices; } catch (error) { console.error('搜索设备失败:', error); return []; } }; // 连接设备 const connectToDevice = async (deviceId) => { try { const result = await DlnaPlayer.connectToDevice(deviceId); console.log('连接设备结果:', result); return result; } catch (error) { console.error('连接设备失败:', error); return false; } }; // 断开设备连接 const disconnectFromDevice = async () => { try { const result = await DlnaPlayer.disconnectFromDevice(); console.log('断开设备连接结果:', result); return result; } catch (error) { console.error('断开设备连接失败:', error); return false; } }; // 播放视频 const playVideo = async (url, title, subtitle, coverUrl) => { try { const result = await DlnaPlayer.playVideo(url, title, subtitle, coverUrl); console.log('播放视频结果:', result); return result; } catch (error) { console.error('播放视频失败:', error); return false; } }; // 暂停播放 const pauseVideo = async () => { try { const result = await DlnaPlayer.pauseVideo(); console.log('暂停播放结果:', result); return result; } catch (error) { console.error('暂停播放失败:', error); return false; } }; // 恢复播放 const resumeVideo = async () => { try { const result = await DlnaPlayer.resumeVideo(); console.log('恢复播放结果:', result); return result; } catch (error) { console.error('恢复播放失败:', error); return false; } }; // 停止播放 const stopVideo = async () => { try { const result = await DlnaPlayer.stopVideo(); console.log('停止播放结果:', result); return result; } catch (error) { console.error('停止播放失败:', error); return false; } }; // 跳转到指定位置 const seekTo = async (position) => { try { const result = await DlnaPlayer.seekTo(position); console.log('跳转结果:', result); return result; } catch (error) { console.error('跳转失败:', error); return false; } }; // 获取播放状态 const getPlaybackStatus = async () => { try { const status = await DlnaPlayer.getPlaybackStatus(); console.log('播放状态:', status); return status; } catch (error) { console.error('获取播放状态失败:', error); return null; } }; // 设置音量 const setVolume = async (volume) => { try { const result = await DlnaPlayer.setVolume(volume); console.log('设置音量结果:', result); return result; } catch (error) { console.error('设置音量失败:', error); return false; } }; // 获取音量 const getVolume = async () => { try { const volume = await DlnaPlayer.getVolume(); console.log('当前音量:', volume); return volume; } catch (error) { console.error('获取音量失败:', error); return 0; } }; // 设置静音 const setMute = async (mute) => { try { const result = await DlnaPlayer.setMute(mute); console.log('设置静音结果:', result); return result; } catch (error) { console.error('设置静音失败:', error); return false; } }; // 获取静音状态 const getMute = async () => { try { const mute = await DlnaPlayer.getMute(); console.log('当前静音状态:', mute); return mute; } catch (error) { console.error('获取静音状态失败:', error); return false; } }; ``` ## 示例 ```javascript import React, { useState, useEffect } from 'react'; import { View, Text, Button, FlatList, StyleSheet } from 'react-native'; import DlnaPlayer from 'react-native-dlna-player'; const DlnaPlayerExample = () => { const [devices, setDevices] = useState([]); const [currentDevice, setCurrentDevice] = useState(null); const [isPlaying, setIsPlaying] = useState(false); const [playbackStatus, setPlaybackStatus] = useState(null); // 搜索设备 const handleSearchDevices = async () => { const foundDevices = await DlnaPlayer.searchDevices(); setDevices(foundDevices); }; // 连接设备 const handleConnectDevice = async (device) => { const result = await DlnaPlayer.connectToDevice(device.id); if (result) { setCurrentDevice(device); } }; // 断开设备连接 const handleDisconnectDevice = async () => { const result = await DlnaPlayer.disconnectFromDevice(); if (result) { setCurrentDevice(null); setIsPlaying(false); setPlaybackStatus(null); } }; // 播放视频 const handlePlayVideo = async () => { const videoUrl = 'https://example.com/video.mp4'; const result = await DlnaPlayer.playVideo( videoUrl, '示例视频', '这是一个示例视频', 'https://example.com/cover.jpg' ); if (result) { setIsPlaying(true); } }; // 暂停/恢复播放 const handleTogglePlay = async () => { if (isPlaying) { const result = await DlnaPlayer.pauseVideo(); if (result) { setIsPlaying(false); } } else { const result = await DlnaPlayer.resumeVideo(); if (result) { setIsPlaying(true); } } }; // 停止播放 const handleStopVideo = async () => { const result = await DlnaPlayer.stopVideo(); if (result) { setIsPlaying(false); } }; // 获取播放状态 const getStatus = async () => { if (currentDevice) { const status = await DlnaPlayer.getPlaybackStatus(); setPlaybackStatus(status); } }; // 定期获取播放状态 useEffect(() => { let interval; if (currentDevice && isPlaying) { interval = setInterval(getStatus, 1000); } return () => { if (interval) { clearInterval(interval); } }; }, [currentDevice, isPlaying]); return ( DLNA播放器示例