如何在Flutter中更改文件扩展名?

问题描述 投票:0回答:1

我必须从网站下载媒体文件,该网站返回如下视频网址:

https://scontent-dfw5-2.cdninstagram.com/vp/1cdfc59a008aa7609b5a91d7fdf58a81/5CB6F8B1/t50.12441-16/57499829_322195418440891_1171410395492073139_n.mp4?_nc_ht=scontent-dfw5-2.cdninstagram.com

我使用flutter_downlaoder下载此视频文件。

下载的文件不包含任何扩展名,所以我必须自己添加。

我必须按以下格式重命名下载的文件:

[用户名] _ [时间戳]的.mp4

问题是当我下载这个没有扩展名的视频文件并通过从存储目录重命名手动添加它时,视频播放正常但是当我以编程方式重命名时它不播放并给出“视频格式错误”。

我在下面分享了我的代码。如何解决这个问题?

Future downloadMedia(String userName, String videoURL, String downloadPath, BuildContext context) async {

String filename = "${userName}_${DateTime.now().millisecondsSinceEpoch}";
String downloadURL = videoURL;


String taskId = await FlutterDownloader.enqueue(
    url: downloadURL,
    savedDir: downloadPath,
    fileName: filename,
    showNotification: false,
    openFileFromNotification: false);

FlutterDownloader.registerCallback((id, status, progress) async {

  if (progress.toInt() >= 100) {

    String newFilename = "$filename.mp4";

    Future.delayed(const Duration(milliseconds: 500), () {
      File(downloadPath + "/" + filename)
          .renameSync(downloadPath + "/" + newFilename);
    });
  }
});
}
dart flutter
1个回答
0
投票

我四处搜索,发现重命名视频文件总是搞乱视频编解码器设置,所以最好的方法是使用FFMpeg处理它。

import 'package:flutter_downloader/flutter_downloader.dart';
import 'package:flutter_ffmpeg/flutter_ffmpeg.dart';

class Download {

  final FlutterFFmpeg _flutterFFmpeg = FlutterFFmpeg();

  Future downloadMedia(String userName, String videoURL, String downloadPath, 
  BuildContext context) async {

    String filename = "${userName}_${DateTime.now().millisecondsSinceEpoch}";
    String filenameOriginal =
    "${userName}_${DateTime.now().millisecondsSinceEpoch}";
    String downloadURL = videoURL;
    var started = false;

    await FlutterDownloader.enqueue(
         url: downloadURL,
         savedDir: downloadPath,
         fileName: filename,
         showNotification: false,
         openFileFromNotification: false);


    FlutterDownloader.registerCallback((id, status, progress) async {

       if (progress.toInt() >= 100) {

          started = true;

          var inputFile = "${downloadPath + "/" + filename}";
          var outputFile = "${downloadPath + "/" + filenameOriginal}_${DateTime.now().millisecondsSinceEpoch}.mp4";

          _flutterFFmpeg
             .execute("-i inputFile -c copy outputFile")
          .then((rc) => print("FFmpeg process exited with rc $rc"));
          //Export file as Mp4 Video
       }
     });
   }
 }

导出的视频文件可以在VLC播放器或MX播放器应用中轻松播放。

© www.soinside.com 2019 - 2024. All rights reserved.