【问题标题】:How to send data from one AsyncTask to another AsyncTask?[video system]如何将数据从一个 AsyncTask 发送到另一个 AsyncTask?[视频系统]
【发布时间】:2014-02-25 07:10:26
【问题描述】:

我正在尝试分别捕获音频数据和视频数据,并将它们编码/混合到 .mp4 文件中。对于音频录制和视频编码都是耗时的工作,我为它们打开了两个 AsyncTasks。

问题来了,我需要将录音任务的数据发送给视频编码任务。但是我没有找到关于AsynTasks之间通信的东西。

谁能给我一个提示?谢谢!

【问题讨论】:

    标签: android audio video android-asynctask mediamuxer


    【解决方案1】:

    MediaCodec API 已经是异步的,您在一种方法中提交输入数据并在另一种方法中检查数据准备情况

    【讨论】:

    • 谢谢!但似乎如果我想对视频和音频进行编码,我需要为 MediaCodec 创建两个实例。它们怎么可能是异步的?
    • 音频编码是在 CPU 上完成的(我不知道有没有硬件音频编码器的设备),而视频编码是在 GPU 上完成的,所以即使在这里它们也没有竞争。此外,所有现代芯片都有多个内核,因此它们可以并行执行多个工作。异步意味着您将任务提交给编解码器并且所有作业都在内部线程中完成,因此您的调用不会阻塞并且您可以在您的应用程序中做一些其他工作,您只需要在内部作业完成时从编解码器获取结果=例如帧编码和编解码器在 dequeueOutputBuffer 上返回有效结果
    • 谢谢。所以在这种情况下,我可以只使用 MediaCodec 进行音频编码。然后我给MediaMuxer提供音视频,只要我异步提供,效果就不错了。对吗?
    • 是的,请考虑使用同步对象,以避免将音频和视频同时发送到复用器。我不确定 muxer 内部是否是线程安全的
    • muxer 应该创建为我认为的捕获器类(对于视频和音频)成员。可以从 onPreview 和 audioRecorder 线程调用 write
    【解决方案2】:

    不知道异步任务之间有任何定义的通信机制。但是其中一个 Async 任务可以将它需要传递的数据写入一个公共对象,而另一个 AsyncTask 可以定期轮询它。

    【讨论】:

      【解决方案3】:

      你可以在第一个 asynctask 的 onPostExecute(Result) 中启动第二个 asynctask

      【讨论】:

      • 谢谢! @user2689294 我检查了一下,它似乎应该可以工作,因为它可以将数据返回到主线程。但是数据是按帧刷新的,请问您有什么办法解决这个问题吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多