subtitle_wrapper 0.1.1 copy "subtitle_wrapper: ^0.1.1" to clipboard
subtitle_wrapper: ^0.1.1 copied to clipboard

A Subtitle Wrapper package, this subtitle wrapper package displays subtitles for implemented players.

example/lib/main.dart

import 'package:flutter/material.dart';
import 'package:flutter_vlc_player/flutter_vlc_player.dart';
import 'package:subtitle_wrapper/data/models/style/subtitle_style.dart';
import 'package:subtitle_wrapper/subtitle_controller.dart';
import 'package:subtitle_wrapper/subtitle_wrapper.dart';
import 'package:subtitle_wrapper/subtitle_wrapper_package.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'VLC Player Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'VLC Player in Stack'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  late VlcPlayerController _vlcPlayerController;
  late UniversalSubtitleController _subtitleController;
  bool _isPlaying = true;
  double _sliderValue = 0.0;

  @override
  void initState() {
    super.initState();
    _vlcPlayerController = VlcPlayerController.network(
      'http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4',
      autoPlay: true,
      options: VlcPlayerOptions(),
    );
    _subtitleController = UniversalSubtitleController(
      subtitleUrl:
          'https://www.opensubtitles.com/download/359337817118D0D29462290D222E3E1DDBF21F0A57BC1518F57249E10AC87A62F0E29F57632274F8A2D21D53833D9F90E45384C9794C3A3CBEA85DC1004048EEF9A336BE0F81C5966B69BE3B4C2DD8820439AAA9FEFDC0CABEBEFDF84DCC33376AA394EFFF28E9D01C953DD2D410BC42603D352E09976055F85CBAFA6F5DE49FFFF3F5087BEFE91976E8E49A5C81A0DCCC50BBCCA465CA5EC5D1D04C3BB8A11D442F0BEC99B82F0FD56CB121B78313B003D53CFDA583DF70BCEB9B8303556FF14F29135CF24F877261B9F40AF0FDB4F1B5B39BAE1799AD6933B652ADAB720A9F2728F21850E41C1E2472C4C5A7EA1DC2D08958C8D84F8A3A/subfile/Iron%20Man.2008.1080p.BluRay.DTS.srt',
      subtitleType: SubtitleType.srt,
      subtitleDecoder: SubtitleDecoder.utf8,
    );
    _vlcPlayerController.addListener(() {
      setState(() {
        _sliderValue = _vlcPlayerController.value.position.inSeconds.toDouble();
      });
    });
  }

  @override
  void dispose() {
    _vlcPlayerController.dispose();
    super.dispose();
  }

  void _togglePlayPause() {
    setState(() {
      if (_isPlaying) {
        _vlcPlayerController.pause();
      } else {
        _vlcPlayerController.play();
      }
      _isPlaying = !_isPlaying;
    });
  }

  void _increaseSubtitleDelay() {
    _subtitleController.addSubtitleDelay(0.1);
  }

  void _decreaseSubtitleDelay() {
    _subtitleController.removeSubtitleDelay(0.1);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.amber,
        title: Text('Subtitles for VLC'),
      ),
      body: ValueListenableBuilder(
          valueListenable: _vlcPlayerController,
          builder: (context, value, child) {
            return Column(
              mainAxisAlignment: MainAxisAlignment.start,
              children: [
                Stack(
                  alignment: Alignment.bottomCenter,
                  children: [
                    VlcPlayer(
                      controller: _vlcPlayerController,
                      aspectRatio: 16 / 9,
                      placeholder:
                          const Center(child: CircularProgressIndicator()),
                    ),
                    SizedBox(
                      height: 80,
                      child: SubtitleWrapper(
                        videoPlayerController: _vlcPlayerController,
                        universalSubtitleController: _subtitleController,
                        styleKey: 1,
                        subtitleStyle: const SubtitleStyle(
                          fontSize: 16,
                          textColor: Colors.white,
                        ),
                      ),
                    ),
                  ],
                ),
                Row(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: [
                    Text('Position ${_vlcPlayerController.value.position}'),
                    SizedBox(width: 10),
                    Text(
                        'Duration ${_vlcPlayerController.value.duration.toString()}'),
                  ],
                ),
                Text(
                    'Delay ${_subtitleController.subtitleDelay.toStringAsFixed(1)}'),
                Padding(
                  padding: const EdgeInsets.all(20.0),
                  child: SliderTheme(
                    data: SliderTheme.of(context).copyWith(
                      overlayShape: SliderComponentShape.noThumb,
                      valueIndicatorColor: Colors.red,
                      activeTrackColor: Colors.grey,
                      inactiveTrackColor: Colors.grey.shade200,
                      thumbColor: Colors.amber,
                      trackHeight: 4.0,
                      thumbShape:
                          const RoundSliderThumbShape(enabledThumbRadius: 10.0),
                    ),
                    child: Slider(
                      min: 0.0,
                      max: _vlcPlayerController.value.duration.inSeconds
                          .toDouble(),
                      value: _sliderValue,
                      secondaryTrackValue:
                          _vlcPlayerController.value.bufferPercent.toDouble(),
                      onChanged: (value) {
                        setState(() {
                          _sliderValue = value;
                        });
                      },
                      onChangeEnd: (value) {
                        final position = Duration(seconds: value.toInt());
                        _vlcPlayerController.setTime(position.inMilliseconds);
                      },
                    ),
                  ),
                ),
                FloatingActionButton(
                  backgroundColor: Colors.amber,
                  onPressed: _increaseSubtitleDelay,
                  tooltip: 'Increase Subtitle Delay',
                  child: Icon(Icons.add),
                ),
                SizedBox(height: 10),
                FloatingActionButton(
                  backgroundColor: Colors.amber,
                  onPressed: _decreaseSubtitleDelay,
                  tooltip: 'Decrease Subtitle Delay',
                  child: Icon(Icons.remove),
                ),
                SizedBox(height: 10),
                FloatingActionButton(
                  backgroundColor: Colors.amber,
                  onPressed: _togglePlayPause,
                  tooltip: _isPlaying ? 'Pause' : 'Play',
                  child: Icon(_isPlaying ? Icons.pause : Icons.play_arrow),
                ),
              ],
            );
          }),
    );
  }
}
0
likes
150
points
75
downloads

Publisher

unverified uploader

Weekly Downloads

A Subtitle Wrapper package, this subtitle wrapper package displays subtitles for implemented players.

Repository (GitHub)

Documentation

API reference

License

MIT (license)

Dependencies

bloc, equatable, flutter, flutter_bloc, flutter_vlc_player, http, http_parser

More

Packages that depend on subtitle_wrapper