オーディオを再生するための react-native-track-player ライブラリの助けを借りて、React ネイティブと Nodjs を使用して、真のオーディオ ストリーミング アプリとサーバーを作成しようとしています。すべてが正常に機能していますが、サーバーからの真のライブ ストリームになると、react-native-track-player はコンテンツ範囲を送信しないため、サーバーはコンテンツ範囲で部分コンテンツ 206 ステータスを応答します。
誰もこれについて何かを得ましたか?
ここに私がサーバー用に持っているもの:
const getLocalFileSubLocation = async (req, res) => {
const { location, sub_location, filename } = req.params
const fileLocation = path.join(UPLOAD_DIR, location, sub_location, filename)
if (!fs.existsSync(fileLocation)) return Resp.notFound(res)
const fileSize = fs.statSync(fileLocation).size
const contentType = mimeTypes.lookup(fileLocation)
if (contentType !== 'audio/mpeg') return fs.createReadStream(fileLocation).pipe(res)
const range = req.headers.range ? req.headers.range : "bytes=0-"
const CHUNK_SIZE = 10 ** 6 / 2; // 1mb
let [start, end] = range.replace(/bytes=/, "").split("-")
start = parseInt(start, 10)
end = start + CHUNK_SIZE
res.writeHead(206, {
"Content-Range": `bytes ${start}-${end}/${fileSize}`,
"Accept-Ranges": "bytes",
"Content-Length": end - start + 1,
"Content-Type": contentType,
});
fs.createReadStream(fileLocation, { start, end }).pipe(res)
}
router.get("/:location/:sub_location/:filename", getLocalFileSubLocation)
一方、オーディオプレーヤー:
await TrackPlayer.setupPlayer({
maxCacheSize: 1048576,
waitForBuffer: true,
});
export const onAddTrack = async (song: any) => {
const track: Track = {
id: song._id,
title: song.title,
url: FILE_URL + song.url,
artist: song.singer?.name,
description: song.description,
artwork: FILE_URL + song.cover,
};
await TrackPlayer.add(track);
};
ヘッダーは次のようになります。
{ 'icy-metadata': '1',
'user-agent':
'react-native-track-player/1.0 (Linux;Android 11) ExoPlayerLib/2.11.4',
'accept-encoding': 'identity',
host: '143.244.142.104:8000',
connection: 'Keep-Alive' }
ストリーミング uri の例を次に示します。http://143.244.142.104:8000/file/songs/audios/default.mp3