Merge pull request #164 from CrissZollo/feature-playback-speed

Feature playback speed
This commit is contained in:
tapframe 2025-10-04 22:06:19 +05:30 committed by GitHub
commit 9d54ec44e4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 27 additions and 1 deletions

View file

@ -188,6 +188,8 @@ const AndroidVideoPlayer: React.FC = () => {
const [textTracks, setTextTracks] = useState<TextTrack[]>([]); const [textTracks, setTextTracks] = useState<TextTrack[]>([]);
const [selectedTextTrack, setSelectedTextTrack] = useState<number>(-1); const [selectedTextTrack, setSelectedTextTrack] = useState<number>(-1);
const [resizeMode, setResizeMode] = useState<ResizeModeType>('contain'); const [resizeMode, setResizeMode] = useState<ResizeModeType>('contain');
const speedOptions = [0.5, 1.0, 1.25, 1.5, 2.0, 2.5, 3.0];
const [playbackSpeed, setPlaybackSpeed] = useState<number>(1.0);
const [buffered, setBuffered] = useState(0); const [buffered, setBuffered] = useState(0);
const [seekTime, setSeekTime] = useState<number | null>(null); const [seekTime, setSeekTime] = useState<number | null>(null);
const videoRef = useRef<VideoRef>(null); const videoRef = useRef<VideoRef>(null);
@ -1643,6 +1645,16 @@ const AndroidVideoPlayer: React.FC = () => {
}, 300); }, 300);
}, [resizeMode]); }, [resizeMode]);
// Cycle playback speed
const cyclePlaybackSpeed = useCallback(() => {
const idx = speedOptions.indexOf(playbackSpeed);
const newIdx = (idx + 1) % speedOptions.length;
const newSpeed = speedOptions[newIdx];
setPlaybackSpeed(newSpeed);
}, [playbackSpeed, speedOptions]);
const enableImmersiveMode = () => { const enableImmersiveMode = () => {
StatusBar.setHidden(true, 'none'); StatusBar.setHidden(true, 'none');
if (Platform.OS === 'android') { if (Platform.OS === 'android') {
@ -3334,7 +3346,7 @@ const AndroidVideoPlayer: React.FC = () => {
resizeMode={getVideoResizeMode(resizeMode)} resizeMode={getVideoResizeMode(resizeMode)}
selectedAudioTrack={selectedAudioTrack || undefined} selectedAudioTrack={selectedAudioTrack || undefined}
selectedTextTrack={useCustomSubtitles ? { type: SelectedTrackType.DISABLED } : (selectedTextTrack >= 0 ? { type: SelectedTrackType.INDEX, value: selectedTextTrack } : undefined)} selectedTextTrack={useCustomSubtitles ? { type: SelectedTrackType.DISABLED } : (selectedTextTrack >= 0 ? { type: SelectedTrackType.INDEX, value: selectedTextTrack } : undefined)}
rate={1.0} rate={playbackSpeed}
volume={volume} volume={volume}
muted={false} muted={false}
repeat={false} repeat={false}
@ -3389,6 +3401,8 @@ const AndroidVideoPlayer: React.FC = () => {
skip={skip} skip={skip}
handleClose={handleClose} handleClose={handleClose}
cycleAspectRatio={cycleAspectRatio} cycleAspectRatio={cycleAspectRatio}
cyclePlaybackSpeed={cyclePlaybackSpeed}
currentPlaybackSpeed={playbackSpeed}
setShowAudioModal={setShowAudioModal} setShowAudioModal={setShowAudioModal}
setShowSubtitleModal={setShowSubtitleModal} setShowSubtitleModal={setShowSubtitleModal}
isSubtitleModalOpen={showSubtitleModal} isSubtitleModalOpen={showSubtitleModal}

View file

@ -30,6 +30,8 @@ interface PlayerControlsProps {
skip: (seconds: number) => void; skip: (seconds: number) => void;
handleClose: () => void; handleClose: () => void;
cycleAspectRatio: () => void; cycleAspectRatio: () => void;
cyclePlaybackSpeed: () => void;
currentPlaybackSpeed: number;
setShowAudioModal: (show: boolean) => void; setShowAudioModal: (show: boolean) => void;
setShowSubtitleModal: (show: boolean) => void; setShowSubtitleModal: (show: boolean) => void;
isSubtitleModalOpen?: boolean; isSubtitleModalOpen?: boolean;
@ -66,6 +68,8 @@ export const PlayerControls: React.FC<PlayerControlsProps> = ({
skip, skip,
handleClose, handleClose,
cycleAspectRatio, cycleAspectRatio,
cyclePlaybackSpeed,
currentPlaybackSpeed,
setShowAudioModal, setShowAudioModal,
setShowSubtitleModal, setShowSubtitleModal,
isSubtitleModalOpen, isSubtitleModalOpen,
@ -177,6 +181,14 @@ export const PlayerControls: React.FC<PlayerControlsProps> = ({
</Text> </Text>
</TouchableOpacity> </TouchableOpacity>
{/* Playback Speed Button */}
<TouchableOpacity style={styles.bottomButton} onPress={cyclePlaybackSpeed}>
<Ionicons name="speedometer" size={20} color="white" />
<Text style={styles.bottomButtonText}>
Speed {currentPlaybackSpeed}x
</Text>
</TouchableOpacity>
{/* Audio Button - Updated to use ksAudioTracks */} {/* Audio Button - Updated to use ksAudioTracks */}
<TouchableOpacity <TouchableOpacity
style={styles.bottomButton} style={styles.bottomButton}