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

مشكلة في تحميل مقاطع الفيديو من اليوتيوب من خلال الروابط بواسطة flutter

Flutter Dev

السؤال

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

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

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

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

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

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

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

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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...