This commit is contained in:
Alex Kim
2024-11-21 16:09:56 +11:00
parent 1aed133a67
commit 52b5b2875c
3 changed files with 36 additions and 31 deletions

View File

@@ -17,7 +17,7 @@ import { getStreamUrl } from "@/utils/jellyfin/media/getStreamUrl";
import { writeToLog } from "@/utils/log"; import { writeToLog } from "@/utils/log";
import native from "@/utils/profiles/native"; import native from "@/utils/profiles/native";
import android from "@/utils/profiles/android"; import android from "@/utils/profiles/android";
import { msToTicks, ticksToMs } from "@/utils/time"; import { msToTicks, ticksToSeconds } from "@/utils/time";
import { Api } from "@jellyfin/sdk"; import { Api } from "@jellyfin/sdk";
import { BaseItemDto } from "@jellyfin/sdk/lib/generated-client"; import { BaseItemDto } from "@jellyfin/sdk/lib/generated-client";
import { import {
@@ -301,8 +301,9 @@ export default function page() {
if (!stream || !item) return null; if (!stream || !item) return null;
console.log("AudioIndex", audioIndex);
const startPosition = item?.UserData?.PlaybackPositionTicks const startPosition = item?.UserData?.PlaybackPositionTicks
? ticksToMs(item.UserData.PlaybackPositionTicks) ? ticksToSeconds(item.UserData.PlaybackPositionTicks)
: 0; : 0;
return ( return (
@@ -327,7 +328,11 @@ export default function page() {
autoplay: true, autoplay: true,
isNetwork: true, isNetwork: true,
startPosition, startPosition,
initOptions: ["--sub-text-scale=60"], initOptions: [
"--sub-text-scale=60",
`--sub-track=${subtitleIndex - 2}`, // This refers to the subtitle position index in the subtitles list.
// `--audio-track=${audioIndex - 1}`, // This refers to the audio position index in the audio list.
],
}} }}
style={{ width: "100%", height: "100%" }} style={{ width: "100%", height: "100%" }}
onVideoProgress={onProgress} onVideoProgress={onProgress}

View File

@@ -10,9 +10,7 @@ class VlcPlayerView: ExpoView {
private var currentGeometryCString: [CChar]? private var currentGeometryCString: [CChar]?
private var lastReportedState: VLCMediaPlayerState? private var lastReportedState: VLCMediaPlayerState?
private var lastReportedIsPlaying: Bool? private var lastReportedIsPlaying: Bool?
private var isMediaReady: Bool = false
private var customSubtitles: [(internalName: String, originalName: String)] = [] private var customSubtitles: [(internalName: String, originalName: String)] = []
private var startPosition: Int32?
// MARK: - Initialization // MARK: - Initialization
@@ -104,12 +102,13 @@ class VlcPlayerView: ExpoView {
guard let self = self else { return } guard let self = self else { return }
let mediaOptions = source["mediaOptions"] as? [String: Any] ?? [:] let mediaOptions = source["mediaOptions"] as? [String: Any] ?? [:]
let initOptions = source["initOptions"] as? [Any] ?? [] var initOptions = source["initOptions"] as? [Any] ?? []
let startPosition = source["startPosition"] as? Int32 ?? 0
initOptions.append("--start-time=\(startPosition)")
let uri = source["uri"] as? String let uri = source["uri"] as? String
let autoplay = source["autoplay"] as? Bool ?? false let autoplay = source["autoplay"] as? Bool ?? false
let isNetwork = source["isNetwork"] as? Bool ?? false let isNetwork = source["isNetwork"] as? Bool ?? false
let startPosition = source["startPosition"] as? Int32 ?? 0
self.startPosition = startPosition
guard let uri = uri, !uri.isEmpty else { guard let uri = uri, !uri.isEmpty else {
print("Error: Invalid or empty URI") print("Error: Invalid or empty URI")
@@ -162,10 +161,6 @@ class VlcPlayerView: ExpoView {
if autoplay { if autoplay {
print("Playing...") print("Playing...")
self.play() self.play()
// if startPosition > 0 {
// print("Debug: Starting at position: \(startPosition)")
// self.seekTo(startPosition)
// }
} }
} }
} }
@@ -584,11 +579,10 @@ extension VlcPlayerView: VLCMediaPlayerDelegate {
} }
// Dermine if the media has finished loading // Dermine if the media has finished loading
if player.isPlaying && !self.isMediaReady { // if player.isPlaying && !self.isMediaReady {
self.isMediaReady = true // self.isMediaReady = true
self.onVideoLoadEnd?(stateInfo) // self.onVideoLoadEnd?(stateInfo)
self.seekToStartTime() // }
}
if self.lastReportedState != currentState if self.lastReportedState != currentState
|| self.lastReportedIsPlaying != player.isPlaying || self.lastReportedIsPlaying != player.isPlaying
@@ -600,21 +594,21 @@ extension VlcPlayerView: VLCMediaPlayerDelegate {
} }
} }
func seekToStartTime() { // func seekToStartTime() {
DispatchQueue.main.async { [weak self] in // DispatchQueue.main.async { [weak self] in
guard let self = self, let player = self.mediaPlayer else { return } // guard let self = self, let player = self.mediaPlayer else { return }
if let startPosition = self.startPosition, startPosition > 0 { // if let startPosition = self.startPosition, startPosition > 0 {
print("Debug: Seeking to start position: \(startPosition)") // print("Debug: Seeking to start position: \(startPosition)")
player.time = VLCTime(int: Int32(startPosition)) // player.time = VLCTime(int: Int32(startPosition))
// Ensure the player continues playing after seeking // // Ensure the player continues playing after seeking
if !player.isPlaying { // if !player.isPlaying {
player.play() // player.play()
} // }
} // }
} // }
} // }
func mediaPlayerTimeChanged(_ aNotification: Notification) { func mediaPlayerTimeChanged(_ aNotification: Notification) {
DispatchQueue.main.async { [weak self] in DispatchQueue.main.async { [weak self] in

View File

@@ -9,7 +9,7 @@ import MediaTypes from "../../constants/MediaTypes";
* Device profile for Native video player * Device profile for Native video player
*/ */
export default { export default {
Name: "1. Native iOS Video Profile", Name: "1. Vlc Player",
MaxStaticBitrate: 100000000, MaxStaticBitrate: 100000000,
MaxStreamingBitrate: 120000000, MaxStreamingBitrate: 120000000,
MusicStreamingTranscodingBitrate: 384000, MusicStreamingTranscodingBitrate: 384000,
@@ -47,6 +47,7 @@ export default {
MaxAudioChannels: "8", MaxAudioChannels: "8",
MinSegments: "2", MinSegments: "2",
BreakOnNonKeyFrames: true, BreakOnNonKeyFrames: true,
EnableSubtitlesInManifest: true,
}, },
{ {
Type: MediaTypes.Audio, Type: MediaTypes.Audio,
@@ -142,5 +143,10 @@ export default {
{ Format: "vplayer", Method: "Embed" }, { Format: "vplayer", Method: "Embed" },
{ Format: "vplayer", Method: "External" }, { Format: "vplayer", Method: "External" },
{ Format: "vplayer", Method: "Encode" }, { Format: "vplayer", Method: "Encode" },
{ Format: "vtt", Method: "Embed" },
{ Format: "vtt", Method: "External" },
{ Format: "vtt", Method: "Encode" },
{ Format: "webvtt", Method: "Embed" },
{ Format: "webvtt", Method: "External" },
], ],
}; };