expo-dlna-player
Version:
A React Native/Expo module for DLNA/AirPlay media casting to smart TVs and streaming devices
165 lines (122 loc) • 4.7 kB
Markdown
# expo-dlna-player
一个用于React Native和Expo应用的DLNA/AirPlay/Miracast投屏播放组件,支持发现和连接媒体设备进行多媒体投屏播放。
## 功能特点
- 支持DLNA、AirPlay和Miracast设备的发现
- 连接媒体设备并进行视频/音频播放
- 控制播放(播放、暂停、停止、进度控制)
- 调整音量
- 支持Android和iOS平台
- 提供屏幕镜像功能(仅支持Miracast设备)
# API文档
- [Documentation for the latest stable release](https://docs.expo.dev/versions/latest/sdk/expo-dlna-player#readme/)
- [Documentation for the main branch](https://docs.expo.dev/versions/unversioned/sdk/expo-dlna-player#readme/)
# 安装(Expo托管项目)
对于[托管](https://docs.expo.dev/archive/managed-vs-bare/)Expo项目,请按照[最新稳定版本的API文档](#api文档)中的安装说明进行操作。如果您点击链接但没有可用的文档,那么此库尚不能在托管项目中使用 — 它可能会在即将发布的Expo SDK版本中包含。
# 安装(裸React Native项目)
对于裸React Native项目,您必须确保已经[安装并配置了`expo`包](https://docs.expo.dev/bare/installing-expo-modules/)。
### 添加依赖包
```bash
npm install expo-dlna-player
# 或者
yarn add expo-dlna-player
```
### Android配置
在`android/app/src/main/AndroidManifest.xml`中添加以下权限:
```xml
<!-- DLNA/UPnP相关权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
<!-- Miracast相关权限(如需使用) -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
```
### iOS配置
运行`npx pod-install`安装原生依赖。
在`Info.plist`中添加以下服务描述:
```xml
<key>NSLocalNetworkUsageDescription</key>
<string>需要使用本地网络来发现并连接到DLNA/AirPlay设备</string>
<key>NSBonjourServices</key>
<array>
<string>_airplay._tcp</string>
<string>_raop._tcp</string>
</array>
```
## 基本用法
```javascript
import ExpoDlnaPlayer, { DeviceInfo } from 'expo-dlna-player';
import { useState, useEffect } from 'react';
function App() {
const [devices, setDevices] = useState([]);
// 开始搜索设备
const startDiscovery = async () => {
try {
await ExpoDlnaPlayer.startDiscovery();
} catch (error) {
console.error("搜索设备失败:", error);
}
};
// 设备发现事件监听
useEffect(() => {
// 注册设备发现监听器
const subscription = ExpoDlnaPlayer.addListener('onDeviceFound', (device) => {
setDevices(prev => [...prev.filter(d => d.id !== device.id), device]);
});
// 开始搜索
startDiscovery();
// 清理
return () => {
subscription.remove();
ExpoDlnaPlayer.stopDiscovery();
};
}, []);
// 连接设备并播放媒体
const playMedia = async (deviceId) => {
try {
// 连接到设备
const connected = await ExpoDlnaPlayer.connectToDevice(deviceId);
if (connected) {
// 播放媒体
await ExpoDlnaPlayer.play("https://example.com/video.mp4", "测试视频");
}
} catch (error) {
console.error("播放失败:", error);
}
};
return (
// 渲染UI...
);
}
```
## API参考
### 设备发现
- `startDiscovery()` - 开始搜索媒体设备
- `stopDiscovery()` - 停止搜索
- `getDevices()` - 获取已发现的设备列表
### 连接与控制
- `connectToDevice(deviceId)` - 连接到指定设备
- `disconnectFromDevice()` - 断开当前连接
- `isConnected()` - 检查是否已连接
- `getConnectedDevice()` - 获取当前连接的设备
### 媒体控制
- `play(url, title, mimeType)` - 播放媒体
- `pause()` - 暂停播放
- `resume()` - 恢复播放
- `stop()` - 停止播放
- `seek(position)` - 定位到指定位置
- `setVolume(volume)` - 设置音量
- `getPlaybackStatus()` - 获取当前播放状态
### Miracast特定功能
- `startProjection(deviceId, mode)` - 开始投屏
- `stopProjection()` - 停止投屏
- `isProjectionSupported()` - 检查设备是否支持投屏
## 事件
通过监听以下事件获取实时反馈:
- `onDeviceFound` - 发现新设备
- `onDeviceDisappeared` - 设备离线
- `onConnectionChanged` - 连接状态变化
- `onPlaybackStatusChanged` - 播放状态更新
- `onError` - 发生错误
# 贡献
欢迎贡献!请参考[贡献指南](https://github.com/expo/expo#contributing)中描述的准则。