如何在 Flutter 中将(编码)像素组合成视频/直播流?

发布于 2025-01-11 06:01:17 字数 1325 浏览 0 评论 0原文

我正在尝试使用 Flutter 制作一个类似于 OBS 的应用程序。

我试图使用 Flutter 引擎将小部件绘制到视频上 框架和屏幕,具有分离的层。

我想出了一个糟糕的方法,即:

  • 使用 RenderRepaintBoundary 来获取特定区域的图像。
  • 使用ffmpeg将这些.png系列合成为h.264编码的视频。
  • (然后也许可以使用.mp4文件作为视频流发布?)

,这在实时性能和效率上显然是棒极了。

(相关代码)

// some_page.dart

int index = 0;

  Future<void> onTestPressed() async {
    int i = 0;
    while (i++ < 600) {
      try {
        var render = repaintKey.currentContext!.findRenderObject()
            as RenderRepaintBoundary;
        double dpr = window.devicePixelRatio;
        var byteData = await render
            .toImage(pixelRatio: dpr)
            .then((image) => image.toByteData(format: ImageByteFormat.png));

        var tempDir = await getTemporaryDirectory();
        var fileName = '${tempDir.path}/frame_${index++}';

        var bytes = byteData!.buffer.asUint8List();
        var file = File(fileName);
        if (!file.existsSync()) {
          file.createSync();
        }

        await file.writeAsBytes(bytes);
        // OpenFile.open(fileName);
      } catch (e) {
        if (kDebugMode) {
          print(e);
        }
      }
    }
  }

I am trying to make an OBS-like app using Flutter.

I was trying to use Flutter engine to draw widgets onto the video
frames, along with screen, with separated layers.

I came up with a bad way, which:

  • use RenderRepaintBoundary to get images of specific area.
  • use ffmpeg to compose these .png series into video with h.264 encoding.
  • (then maybe use .mp4 files to publish as video stream??)

, which is baaad in real-time performance and efficiency apparently.

(relevant code)

// some_page.dart

int index = 0;

  Future<void> onTestPressed() async {
    int i = 0;
    while (i++ < 600) {
      try {
        var render = repaintKey.currentContext!.findRenderObject()
            as RenderRepaintBoundary;
        double dpr = window.devicePixelRatio;
        var byteData = await render
            .toImage(pixelRatio: dpr)
            .then((image) => image.toByteData(format: ImageByteFormat.png));

        var tempDir = await getTemporaryDirectory();
        var fileName = '${tempDir.path}/frame_${index++}';

        var bytes = byteData!.buffer.asUint8List();
        var file = File(fileName);
        if (!file.existsSync()) {
          file.createSync();
        }

        await file.writeAsBytes(bytes);
        // OpenFile.open(fileName);
      } catch (e) {
        if (kDebugMode) {
          print(e);
        }
      }
    }
  }

???? I know that Flutter uses Skia as its graphic engine, and could I use Skia ability (by drawing widgets) somehow so as to produce video frames more directly?

Thank you.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文