在Flutter应用程序中使用Java或其他语言

时间:2018-08-27 18:08:38

标签: java android audio video flutter

由于我对这个问题没有答案,也没有太多反馈:Android Flutter Analyze Audio Waveform 并在网上找不到我要寻找的东西,我只想问一个更广泛的问题,因为对该答案的评论告诉我使用本机代码并使用平台渠道将其连接起来,但是当我问一些澄清时,一无所有。

所以我的问题是,是否可以用Java 进行操作(这种操作已经存在了很长时间,因此具有更大的文档编制方式),然后在Flutter中使用结果。

更准确地说,我可以在Java和Flutter中做这些事情吗?

1)分析音频波形并找到特定频率的峰值点,并使用时间戳将其显示为颤动;

编辑1: 什么是高峰点?

enter image description here

这是不同频率范围的波形(橙色是低音(80-255Hz)),黑色圆圈中的点是峰值点。我应该分析一首歌曲的音频频谱,并找出某些频率下的峰值。然后,当我找到峰值时,我需要保存时间戳,例如16秒等等。

2)编辑2: 我需要编辑视频中的一些照片,例如视频拼贴,其中30或60fps视频的每一帧都是一幅图像。

3)编辑3: 我需要为视频添加基本的特定于帧的效果,例如将帧间变化的模糊或眩光。

4)将音乐添加到该视频并将其保存为mp4或avi或任何格式。

5)编辑4:最重要的事情是,我不想实时完成所有操作,而是更像After Effects之类的Render流程,其中所有帧都一起渲染。唯一会令人高兴的事情是一种进度条,告诉用户“渲染”处于帧中,例如300中的200,但是我不想显示任何帧或视频,只是为了渲染它在后台播放,然后将其保存到mp4视频中,之后即可观看。

如您所见,用一种语言很难做到这一点,由于它的早期状态,您几乎找不到关于如何播放音乐的教程。但是Uis和其他一些东西在flutter中更容易实现,而Flutter也是多平台的。因此,我更喜欢使用Flutter语言。

编辑5: 我看了一下Qt和JUCE,发现Qt似乎是一个有效的选择,但是对于更理解为“封闭式”系统的情况,我的意思是,例如,我看了多媒体库,但对于我所了解的,您可以做一些基本的事情,例如播放视频,但不能拼贴帧并保存。 (不知道我对自己的解释是否很好)。 JUCE另一方面,外观看起来更好,但PC音频VST似乎比移动应用程序(包括视频渲染)要多。另一件事是,这两个不是像Flutter一样免费和开源的。

然后有Kivy,它可能是也可能不是最好的,因为它是用于移动设备的Python端口,并且我在Python方面有很多经验,我认为它是一种更容易学习的语言,但是在另一方面,它没有那么多的UI功能。正如您提到的,在Android上使用库可能会出现问题。

您说我可以将C ++或Java与Flutter一起使用,但是对于C ++,您告诉我这是一个艰难的过程。 所以我的问题是我可以用普通的Android应用程序用Java编写流程,然后以某种方式使用Flutter App中的功能吗?

编辑6: 我找到了可能的选择: 卡(http://kha.tech/)。但是再次发现如何在Flutter上使用它。 这是个好主意吗?

我想进一步确认我是否可以使用Java或任何其他语言来完成Flutter应用程序中需要做的事情。如果是的话,它是否很复杂。 (我是初学者)。但是一些启动代码的教程或链接也会有所帮助!

1 个答案:

答案 0 :(得分:1)

这时的Flutter非常适合构建UI,但是正如您已经提到的那样,Flutter还没有强大的功能或与库的兼容性。这样做的很大一部分原因是它与c ++的集成不容易,但是我现在不会进入that

您要问的内容很可能是可行的,但这绝非易事。首先,听起来您想从视频中提取特定帧并显示它们-这将是一个额外的麻烦。而且不要忘记,在移动设备上,您的处理能力会有所限制-事情必须是非常异步的,除非您小心,否则实际上会引起抖动问题。

关于您的观点:

  1. 这是一个非常笼统的问题。我建议您查找android音频处理库。我几乎肯定这是可能的,但是SO问题并不是要就使用哪种框架提出建议。尝试https://softwarerecs.stackexchange.com/

  2. 再一次,相当笼统,不清楚您要问什么...尝试sofwarerecs。我假设您要拍摄几帧并将其制作成视频?

  3. 其中某些效果(即缩放)绝对可以通过使用“变换”来扑动。但这只是在扑打而已,而不是自己添加到视频文件中。为此,您必须使用android / java代码中的视频库。

  4. 视频库应该再次执行此操作。

  5. 这也应该是视频库的一部分。

我确实知道我头顶上有一个名为Processing的音频/视频库,可能可以满足您的需求,但不确定。它确实有一个android sdk。 OpenCV将是另一个,但仅用于视频/图像处理,而且我还没有直接将其与Java一起使用,因此不确定使用起来有多么容易。

要了解如何与抖动一起实现这一点……您将需要使用Platform Channels。我在对其他答案的评论中提到了他们,但认为您可以自己查一下。该文档在解释其工作原理和设置方法方面做得比我做得更好。但是TLDR实质上是,它们允许您执行的操作是将序列化数据从本机代码(java / kotlin / swift等)发送到颤动代码(dart),反之亦然,然后将其转换为目标中的类似数据结构语言。您可以设置数据流经的各种“通道”,并在这些通道内设置在任一端调用的“方法”,或简单地来回发送事件。

我在一开始提到的复杂之处在于,在抖动和飞镖之间的通道之间来回发送图像并不是最佳选择。您很可能不会从Java发送到dart的图像达到24/30 / 60fps的流畅水平,并且这可能会显着降低其余ui的抖动。因此,您想要用于实际视口的是Texture,它仅显示来自android端的数据。您必须弄清楚如何自己从android写入纹理,但是有很多可用的信息。控件,音频的可视化等都可以通过从本地获取的数据直接在颤动中完成。

您将拥有的实际上是一个用dart / flutter编写的遥控器,该遥控器将各种命令发送到Java中的音频/视频处理库和包装器代码。

如果这听起来很复杂,那是因为。尽管使用flutter可以很好地构建UI,但我怀疑如果仅将android作为目标,是否值得增加额外的复杂性。


与答案不是真的相关,而是一些友好的建议:

我还要提到另一件事-我不知道您对编程和使用不同语言的熟练程度,但是视频/音频处理等通常不是在Java中完成,而是在实际的本机代码中完成(即c / c ++)。因此,实际上您必须在两个层次上处理抽象(在某种程度上,取决于您使用的库,它可能会多少有些抽象)-c / c ++到java和Java飞镖。

您可能希望削减中间商并与本地人直接合作-在这种情况下,我建议至少看看QtJUCE,因为它们可能比扑扑更合适针对您的特定用例。还有Kivy(使用python)可能会很好用,因为有大量用于Python的图像/视频/音频处理库...尽管它们可能无法全部在android上运行并且仍然具有c ++ => python翻译在某种程度上。不过,您必须考虑许可等问题-Qt对于大多数android应用都有足够广泛的OS许可证,但是JUCE您必须付费,除非您使用的是开源软件。我不得不比其他人推荐更多的Qt,因为它实际上具有视频帧等的本地解码功能,尽管您可能希望将OpenCV或其他一些功能用于您正在谈论的更复杂的效果。但这可能和简单地用Java代码编写一样复杂,但是UI风格略有不同,并且更易于与c ++库集成。