国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

flutter開發(fā)實戰(zhàn)-實現(xiàn)獲取視頻的縮略圖封面video_thumbnail

這篇具有很好參考價值的文章主要介紹了flutter開發(fā)實戰(zhàn)-實現(xiàn)獲取視頻的縮略圖封面video_thumbnail。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

flutter開發(fā)實戰(zhàn)-實現(xiàn)獲取視頻的縮略圖封面video_thumbnail

在很多時候,我們查看視頻的時候,視頻沒有播放時候,會顯示一張封面,可能封面沒有配置圖片,這時候就需要通過獲取視頻的縮略圖來顯示封面了。這里使用了video_thumbnail來實現(xiàn)獲取視頻的縮略圖。

一、引入video_thumbnail

在工程的pubspec.yaml中引入插件

  # 視頻縮略圖
  video_thumbnail: ^0.5.3
    

VideoThumbnail的屬性如下

static Future<String?> thumbnailFile(
      {required String video,
      Map<String, String>? headers,
      String? thumbnailPath,
      ImageFormat imageFormat = ImageFormat.PNG,
      int maxHeight = 0,
      int maxWidth = 0,
      int timeMs = 0,
      int quality = 10}) 
    
  • thumbnailPath為本地存儲的文件目錄
  • imageFormat格式 jpg,png等
  • video視頻地址
  • timeMs

二、獲取視頻的縮略圖

使用video_thumbnail來獲取視頻縮略圖

定義視頻縮略圖信息

class VideoThumbInfo {
  String url; // 原視頻地址
  File? thumbFile; // 縮略圖本地file
  int? width; // 縮略圖的width
  int? height; // 縮略圖的height

  VideoThumbInfo({
    required this.url,
  });
}
    

獲取視頻縮略圖本地File

String path = (await getTemporaryDirectory()).path;
    String thumbnailPath = path + "/${DateTime.now().millisecond}.jpg";
    final fileName = await VideoThumbnail.thumbnailFile(
      video:
          "https://vd2.bdstatic.com/mda-maif0tt1rirqp27q/540p/h264_cae/1611052585/mda-maif0tt1rirqp27q.mp4",
      thumbnailPath: thumbnailPath,
      imageFormat: imageFormat,
      quality: quality,
      maxWidth: maxWidth,
      maxHeight: maxHeight,
      timeMs: timeMs,
    );

    File file = File(thumbnailPath);
    

獲取縮略圖的寬高

Image image = Image.file(thumbFile!);
      image.image.resolve(const ImageConfiguration()).addListener(
            ImageStreamListener(
              (ImageInfo imageInfo, bool synchronousCall) {
                int imageWidth = imageInfo.image.width;
                int imageHeight = imageInfo.image.height;
                VideoThumbInfo videoThumbInfo = VideoThumbInfo(url: url);
                videoThumbInfo.thumbFile = thumbFile;
                videoThumbInfo.width = imageWidth;
                videoThumbInfo.height = imageHeight;
                VideoThumb.setThumbInfo(url, videoThumbInfo);
                onVideoThumbInfoListener(videoThumbInfo);
              },
              onError: (exception, stackTrace) {
                print(
                    "getVideoThumbInfoByFile imageStreamListener onError exception:${exception.toString()},stackTrace:${stackTrace}");
                onVideoThumbInfoListener(null);
              },
            ),
          );
    

完整代碼如下

import 'dart:io';
import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';
import 'package:video_thumbnail/video_thumbnail.dart';

// ignore: non_constant_identifier_names
VideoThumbManager get VideoThumb => VideoThumbManager.instance;

class VideoThumbManager {
  static VideoThumbManager get instance {
    return _singleton;
  }

  //保存單例
  static VideoThumbManager _singleton = VideoThumbManager._internal();

  //工廠構造函數(shù)
  factory VideoThumbManager() => _singleton;

  //私有構造函數(shù)
  VideoThumbManager._internal();

  // 保存url對應的本地縮略圖file
  final _thumbMap = Map<String, File>();

  // url對應本地縮略圖的信息
  final _thumbInfoMap = Map<String, VideoThumbInfo>();

  Future<void> setThumb(String url, File file) async {
    if (url.isEmpty) {
      return;
    }

    bool exist = await file.exists();
    if (exist == false) {
      return;
    }

    _thumbMap[url] = file;
  }

  Future<File?> getThumb(
    String url, {
    ImageFormat imageFormat = ImageFormat.JPEG,
    int maxHeight = 0,
    int maxWidth = 0,
    int timeMs = 0,
    int quality = 100,
  }) async {
    File? thumbFile = _thumbMap[url];
    if (thumbFile != null) {
      return thumbFile;
    }

    String path = (await getTemporaryDirectory()).path;
    String thumbnailPath = path + "/${DateTime.now().millisecond}.jpg";
    final fileName = await VideoThumbnail.thumbnailFile(
      video:
          "https://vd2.bdstatic.com/mda-maif0tt1rirqp27q/540p/h264_cae/1611052585/mda-maif0tt1rirqp27q.mp4",
      thumbnailPath: thumbnailPath,
      imageFormat: imageFormat,
      quality: quality,
      maxWidth: maxWidth,
      maxHeight: maxHeight,
      timeMs: timeMs,
    );

    File file = File(thumbnailPath);
    setThumb(url, file);
    return file;
  }

  // 獲取縮略圖的大小
  void getVideoThumbInfo(
    String url, {
    ImageFormat imageFormat = ImageFormat.JPEG,
    int maxHeight = 0,
    int maxWidth = 0,
    int timeMs = 0,
    int quality = 100,
    required Function(VideoThumbInfo?) onVideoThumbInfoListener,
  }) async {
    try {
      VideoThumbInfo? thumbInfo = VideoThumb.getThumbInfo(url);
      if (thumbInfo != null) {
        onVideoThumbInfoListener(thumbInfo);
        return;
      }

      await VideoThumb.getThumb(
        url,
        imageFormat: imageFormat,
        maxWidth: maxWidth,
        maxHeight: maxHeight,
        timeMs: timeMs,
        quality: quality,
      ).then((value) {
        File? thumbFile = value;
        if (thumbFile != null) {
          VideoThumb.getVideoThumbInfoByFile(
            url: url,
            thumbFile: thumbFile,
            onVideoThumbInfoListener: onVideoThumbInfoListener,
          );
        } else {
          onVideoThumbInfoListener(null);
        }
      }).onError((error, stackTrace) {
        print("getVideoThumbInfo error:${error.toString()}");
        onVideoThumbInfoListener(null);
      }).whenComplete(() {
        print("getVideoThumbInfo whenComplete");
      });
    } catch (e) {
      print("getVideoThumbInfo catch error:${e.toString()}");
      onVideoThumbInfoListener(null);
    }
  }

  /// 根據(jù)file獲取縮略圖信息
  void getVideoThumbInfoByFile({
    required String url,
    required File thumbFile,
    required Function(VideoThumbInfo?) onVideoThumbInfoListener,
  }) async {
    try {
      VideoThumbInfo? thumbInfo = VideoThumb.getThumbInfo(url);
      if (thumbInfo != null) {
        onVideoThumbInfoListener(thumbInfo);
        return;
      }

      Image image = Image.file(thumbFile!);
      image.image.resolve(const ImageConfiguration()).addListener(
            ImageStreamListener(
              (ImageInfo imageInfo, bool synchronousCall) {
                int imageWidth = imageInfo.image.width;
                int imageHeight = imageInfo.image.height;
                VideoThumbInfo videoThumbInfo = VideoThumbInfo(url: url);
                videoThumbInfo.thumbFile = thumbFile;
                videoThumbInfo.width = imageWidth;
                videoThumbInfo.height = imageHeight;
                VideoThumb.setThumbInfo(url, videoThumbInfo);
                onVideoThumbInfoListener(videoThumbInfo);
              },
              onError: (exception, stackTrace) {
                print(
                    "getVideoThumbInfoByFile imageStreamListener onError exception:${exception.toString()},stackTrace:${stackTrace}");
                onVideoThumbInfoListener(null);
              },
            ),
          );
    } catch (e) {
      print("getVideoThumbInfoByFile catch error:${e.toString()}");
      onVideoThumbInfoListener(null);
    }
  }

  void removeThumb(String url) {
    if (url.isEmpty) {
      return;
    }

    _thumbMap.remove(url);
  }

  /// 獲取存儲縮略圖信息
  VideoThumbInfo? getThumbInfo(String url) {
    if (url.isEmpty) {
      return null;
    }

    VideoThumbInfo? thumbInfo = _thumbInfoMap[url];
    return thumbInfo;
  }

  /// 存儲縮略圖信息
  void setThumbInfo(String url, VideoThumbInfo videoThumbInfo) async {
    if (url.isEmpty) {
      return;
    }

    _thumbInfoMap[url] = videoThumbInfo;
  }

  void removeThumbInfo(String url) {
    if (url.isEmpty) {
      return;
    }

    _thumbInfoMap.remove(url);
  }

  void clear() {
    _thumbMap.clear();
    _thumbInfoMap.clear();
  }
}

class VideoThumbInfo {
  String url; // 原視頻地址
  File? thumbFile; // 縮略圖本地file
  int? width; // 縮略圖的width
  int? height; // 縮略圖的height

  VideoThumbInfo({
    required this.url,
  });
}

    

三、顯示視頻縮略圖的Widget

用于顯示視頻縮略圖的Widget

/// 用于顯示視頻縮略圖的Widget
class VideoThumbImage extends StatefulWidget {
  const VideoThumbImage(
      {super.key, required this.url, this.maxWidth, this.maxHeight});

  final String url;
  final double? maxWidth;
  final double? maxHeight;

  @override
  State<VideoThumbImage> createState() => _VideoThumbImageState();
}

class _VideoThumbImageState extends State<VideoThumbImage> {
  VideoThumbInfo? _videoThumbInfo;

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    VideoThumb.getVideoThumbInfo(widget.url,
        onVideoThumbInfoListener: (VideoThumbInfo? thumbInfo) {
      if (mounted) {
        setState(() {
          _videoThumbInfo = thumbInfo;
        });
      }
    });
  }

  @override
  void dispose() {
    // TODO: implement dispose
    super.dispose();
  }

  // 根據(jù)VideoThumb來顯示圖片
  Widget buildVideoThumb(BuildContext context) {
    if (_videoThumbInfo != null && _videoThumbInfo!.thumbFile != null) {
      double? imageWidth;
      double? imageHeight;
      if (_videoThumbInfo!.width != null && _videoThumbInfo!.height != null) {
        imageWidth = _videoThumbInfo!.width!.toDouble();
        imageWidth = _videoThumbInfo!.height!.toDouble();
      }

      return Container(
        width: imageWidth,
        height: imageHeight,
        clipBehavior: Clip.hardEdge,
        decoration: const BoxDecoration(
          color: Colors.transparent,
        ),
        child: Image.file(
          _videoThumbInfo!.thumbFile!,
          width: imageWidth,
          height: imageHeight,
        ),
      );
    }

    return Container();
  }

  @override
  Widget build(BuildContext context) {
    return ConstrainedBox(
      constraints: BoxConstraints(
        maxWidth: widget.maxWidth ?? double.infinity,
        maxHeight: widget.maxHeight ?? double.infinity,
      ),
      child: buildVideoThumb(context),
    );
  }
}

    

效果圖如下:

flutter 獲取視頻封面,flutter開發(fā)實戰(zhàn),flutter,移動開發(fā),flutter,1024程序員節(jié),android

四、小結

flutter開發(fā)實戰(zhàn)-實現(xiàn)獲取視頻的縮略圖封面video_thumbnail

學習記錄,每天不停進步。文章來源地址http://www.zghlxwxcb.cn/news/detail-797496.html

到了這里,關于flutter開發(fā)實戰(zhàn)-實現(xiàn)獲取視頻的縮略圖封面video_thumbnail的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • uniapp 上傳視頻到阿里云之后回顯視頻獲取視頻封面

    uniapp 上傳視頻到阿里云之后回顯視頻獲取視頻封面

    1.initial-time Number 指定視頻初始播放位置,單位為秒(s)。 沒什么卵用 2.使用 uni.createVideoContext(“myVideo”, this).seek(number)。 沒什么卵用 t_1000 等于截取視頻第 1秒作為封面

    2024年04月11日
    瀏覽(20)
  • JavaScrip獲取視頻第一幀作為封面圖

    在JavaScript中,你可以使用HTML5的video元素來加載視頻,然后使用Canvas來捕獲視頻的第一幀作為封面圖。以下是一個簡單的例子: 請注意,這個例子中使用了loadeddata事件,該事件在視頻的第一幀加載完成后觸發(fā)。這里創(chuàng)建了一個Canvas元素,通過drawImage方法將視頻的第一幀繪制在

    2024年01月16日
    瀏覽(15)
  • JS 怎么獲取視頻第一幀作為封面圖?

    要獲取視頻的第一幀作為封面圖,你可以使用HTML5的 video 元素和 JavaScript 來實現(xiàn)。下面是一個簡單的步驟: 在HTML中,創(chuàng)建一個 video 元素,并設置視頻的路徑或URL: 在JavaScript中,獲取 video 元素的引用,并監(jiān)聽它的 loadedmetadata 事件(視頻元數(shù)據(jù)加載完成時觸發(fā)): 繼續(xù)在JavaS

    2024年04月10日
    瀏覽(22)
  • flutter開發(fā)實戰(zhàn)-獲取Widget的大小及位置

    flutter開發(fā)實戰(zhàn)-獲取Widget的大小及位置 最近開發(fā)過程中需要獲取Widget的大小及位置,這時候就需要使用到了GlobalKey了和WidgetsBinding.instance.addPostFrameCallback了 該函數(shù)的作用: flutter中的界面組件Widget每一幀渲染在界面上,addPostFrameCallback功能是在每一幀繪制完成后再回調執(zhí)行自定

    2024年02月13日
    瀏覽(23)
  • js前端獲取video視頻名稱+時長+縮略圖+寬高

    js前端獲取video視頻名稱+時長+縮略圖+寬高,縮略圖的核心是用canvas畫出來的base64圖片,調用函數(shù)需要傳入二進制的視頻文件,注意這是一個promise函數(shù),需要用then來接收,代碼如下

    2024年02月12日
    瀏覽(24)
  • 視頻格式網(wǎng)絡地址轉換視頻到本地,獲取封面、時長,其他格式轉換成mp4

    視頻格式網(wǎng)絡地址轉換視頻到本地,獲取封面、時長,其他格式轉換成mp4

    使用ffmpeg軟件轉換網(wǎng)絡視頻,先從官網(wǎng)下載對應操作系統(tǒng)環(huán)境的包 注意:網(wǎng)絡地址需要是視頻格式結尾,例如.mp4,.flv 等 官網(wǎng)地址:Download FFmpeg? ? ? window包: linux包: 如果下載緩慢,下載迅雷安裝使用下載。 解壓縮后對應截圖: window: linux: 在maven項目的pom.xml引入依賴包

    2024年02月03日
    瀏覽(90)
  • flutter開發(fā)實戰(zhàn)-獲取屏幕顯示大小及物理像素分辨率

    flutter開發(fā)實戰(zhàn)-獲取屏幕顯示大小及物理像素分辨率 在開發(fā)過程中,經(jīng)常遇到需要獲取屏幕顯示的大小及物理像素分辨率,這里會用到MediaQuery,MediaQuery必須依賴BuildContext的上下文才能使用。 flutter中MediaQuery是一個用于獲取設備屏幕信息的類??梢杂盟鼇慝@取屏幕寬度、高度

    2024年02月11日
    瀏覽(27)
  • flutter開發(fā)實戰(zhàn)-video_player視頻播放功能及視頻緩存

    flutter開發(fā)實戰(zhàn)-video_player視頻播放功能及視頻緩存

    flutter開發(fā)實戰(zhàn)-video_player視頻播放功能及視頻緩存 最近開發(fā)過程中video_player播放視頻, 在pubspec.yaml引入video_player 在iOS上,video_player使用的是AVPlayer進行播放。 在Android上,video_player使用的是ExoPlayer。 2.1 在iOS中的設置 在iOS工程中info.plist添加一下設置,以便支持Https,HTTP的視頻

    2024年02月14日
    瀏覽(25)
  • flutter開發(fā)實戰(zhàn)-video_player播放多個視頻MediaCodecVideoRenderer error問題

    flutter開發(fā)實戰(zhàn)-video_player播放多個視頻MediaCodecVideoRenderer error問題 在開發(fā)過程中,我這里使用video_player播放多個視頻的時候,出現(xiàn)了MediaCodecVideoRenderer error 使用video_player播放單個視頻請查看 https://blog.csdn.net/gloryFlow/article/details/132124837 這里記錄一下解決多個視頻MediaCodecVideoRe

    2024年02月09日
    瀏覽(24)
  • flutter開發(fā)實戰(zhàn)-inappwebview實現(xiàn)flutter與Javascript方法調用

    flutter開發(fā)實戰(zhàn)-inappwebview實現(xiàn)flutter與Javascript方法調用

    flutter開發(fā)實戰(zhàn)-inappwebview實現(xiàn)flutter與Javascript方法調用 在使用inappwebview時候,需要flutter端與JS進行交互,調用相應的方法,在inappwebview中的JavaScript Handlers。 要添加JavaScript Handlers,可以使用InAppWebViewController.addJavaScriptHandler方法,在該方法中定義handlerName和JavaScript端調用它時要

    2024年02月03日
    瀏覽(30)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包