اذهب إلى المحتوى

السؤال

نشر

تحيه طيبه للجميع

قمت بعمل تطبيق صغير من خلال هذا التطبيق المستخدم يمكنه لصق رابط فيديو اليوتيوب ثم القيام بعملية تحميل هذا المقطع الى هاتفه

المشكلة ان المقطع يتم تحميله ولكن لا يعمل يظهر مسج مع محاولة تشغيل هذا المقطع تفيد ان المقطع تالف

أيضا وجدت ان حجم المقاطع تأتي ب صيغة كيلوبايت وذلك غير منطقي وليس حقيقي

حيث ان المقطع طويل جدا كان من المفترض ان احصل على ميجابايت ك حجم للمقطع

 اذا احد يعرف حل للمشكلة يفيدنا بذلك

الكود المستعمل كالتالي:

class DownloadPage extends StatefulWidget {
  @override
  _DownloadPageState createState() => _DownloadPageState();
}

class _DownloadPageState extends State<DownloadPage> {
  TextEditingController _linkController = TextEditingController();
  bool _isLoading = false;
  double _progress = 0;

  Future<void> _downloadVideo(String link) async {
    setState(() {
      _isLoading = true;
    });

    // Check for storage permission
    var status = await Permission.storage.status;
    if (status.isDenied) {
      await Permission.storage.request();
    }

    // Get the directory to store the video
    final directory = await getExternalStorageDirectory();
    final filePath = directory!.path + '/video.mp4';

    // Download the video
    var response = await http.get(Uri.parse (link));
    var file = File(filePath);
    await file.writeAsBytes(response.bodyBytes);

    setState(() {
      _isLoading = false;
      _progress = 0;
    });

    // Show a success message
    showDialog(
      context: context,
      builder: (context) => AlertDialog(
        title: Text('Download Complete'),
        content: Text('Video has been saved to $filePath'),
        actions: [
          ElevatedButton(
            child: Text('OK'),
            onPressed: () {
              Navigator.of(context).pop();
            },
          ),
        ],
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Download Video'),
      ),
      body: Padding(
        padding: EdgeInsets.all(16.0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            TextField(
              controller: _linkController,
              decoration: InputDecoration(
                hintText: 'Enter YouTube link',
              ),
            ),
            SizedBox(height: 16.0),
            _isLoading
                ? Column(
              children: [
                LinearProgressIndicator(
                  value: _progress,
                ),
                SizedBox(height: 16.0),
                Text('$_progress %'),
              ],
            )
                : ElevatedButton(
              child: Text('Download'),
              onPressed: () {
                _downloadVideo(_linkController.text);
              },
            ),
          ],
        ),
      ),
    );
  }
}

 

Recommended Posts

  • 0
نشر

فيما يتعلق بالرسالة التي تشير إلى تلف المقطع ، فمن المحتمل أن يكون ذلك بسبب عدم فك تشفير الفيديو أو كتابته بشكل صحيح في الملف. لإصلاح هذه المشكلة ، يمكنك محاولة استخدام مكتبة مثل flutter_video_compress أو video_player لفك تشفير الفيديو وتشغيله.

import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'package:flutter_video_compress/flutter_video_compress.dart';
import 'package:path_provider/path_provider.dart';
import 'package:video_player/video_player.dart';

class DownloadPage extends StatefulWidget {
  @override
  _DownloadPageState createState() => _DownloadPageState();
}

class _DownloadPageState extends State<DownloadPage> {
  TextEditingController _linkController = TextEditingController();
  VideoPlayerController _videoPlayerController;
  bool _isLoading = false;
  double _progress = 0;

  Future<void> _downloadVideo(String link) async {
    setState(() {
      _isLoading = true;
    });

    final directory = await getTemporaryDirectory();
    final tempPath = directory.path + '/temp_video.mp4';

    var response = await http.get(Uri.parse(link));
    var file = File(tempPath);
    await file.writeAsBytes(response.bodyBytes);

    final videoCompress = FlutterVideoCompress();
    final result = await videoCompress.compressVideo(tempPath, quality: VideoQuality.LowQuality);
    final videoPath = result["videoPath"];

    _videoPlayerController = VideoPlayerController.file(File(videoPath))
      ..initialize().then((_) {
        setState(() {});
      });

    setState(() {
      _isLoading = false;
      _progress = 0;
    });

    showDialog(
      context: context,
      builder: (context) => AlertDialog(
        title: Text('Download Complete'),
        content: Text('Video has been saved to $videoPath'),
        actions: [
          ElevatedButton(
            child: Text('OK'),
            onPressed: () {
              Navigator.of(context).pop();
            },
          ),
        ],
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Download Video'),
      ),
      body: Padding(
        padding: EdgeInsets.all(16.0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            TextField(
              controller: _linkController,
              decoration: InputDecoration(
                hintText: 'Enter YouTube link',
              ),
            ),
            SizedBox(height: 16.0),
            _isLoading
                ? Column(
              children: [
                LinearProgressIndicator(
                  value: _progress,
                ),
                SizedBox(height: 16.0),
                Text('$_progress %'),
              ],
            )
                : ElevatedButton(
              child: Text('Download'),
              onPressed: () {
                _downloadVideo(_linkController.text);
              },
            ),
          ],
        ),
      ),
    );
  }
}

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...