4

现在,我制作了一个库来连接 2 个视频,使用 mp4parser 库。有了这个,我可以暂停和继续录制视频(在录制第二个视频后,它会将其附加到第一个视频)。现在,我的老板告诉我做一个包装器,并将它用于没有硬件支持暂停视频的手机。对于具有该功能的手机(三星 Galaxy S2 和三星 Galaxy S1 可以使用他们的相机应用程序暂停视频录制),我需要在没有库的情况下执行此操作,因此速度会很快。如果在媒体记录器状态图http://developer.android.com/reference/android/media/MediaRecorder.html上看到,我该如何实现这个本机,没有暂停状态?

我已经从 Samsung Galaxe Ace 反编译了 Camera.apk 应用程序,并且代码在 CamcorderEngine.class 中有这样的方法:

public void doPauseVideoRecordingSync()
{
Log.v("CamcorderEngine", "doPauseVideoRecordingSync");
if (this.mMediaRecorder == null)
{
  Log.e("CamcorderEngine", "MediaRecorder is not initialized.");
  return;
}
if (!this.mMediaRecorderRecording)
{
  Log.e("CamcorderEngine", "Recording is not started yet.");
  return;
}
try
{
  this.mMediaRecorder.pause();
  enableAlertSound();
  return;
}
catch (RuntimeException localRuntimeException)
{
  Log.e("CamcorderEngine", "Could not pause media recorder. ", localRuntimeException);
  enableAlertSound();
}

}

如果我在我的代码中尝试this.mMediaRecorder.pause();,它不起作用,这怎么可能,他们使用相同的导入(android.media.MediaRecorder)。他们是否在系统级别重写了整个代码?

是否可以获取第二个视频的输入流(在录制时),并将这些数据直接附加到我的第一个视频中?对于我的连接方法,我使用 2 个参数(2 个视频,它们都是 FileInputStream),是否可以从录制函数中获取 InputStream 并将其作为第二个参数传递?

4

1 回答 1

2

如果我尝试 this.mMediaRecorder.pause();

该类MediaRecorder没有pause()功能,因此很明显在这个特定设备上有一个自定义的 MediaRecorder 类。这并不稀奇,因为 OEM 唯一要求的就是通过设备上的“android 兼容性测试”;添加功能没有限制。

是否可以获取第二个视频的输入流(在录制时),并将这些数据直接附加到我的第一个视频中?

我不确定您是否可以这样做,因为视频流是编码数据(编解码器标头、关键帧等),在我看来,仅将 2 个流合并为 1 个文件不会产生有效的视频文件。

基本上你可以做什么:

  1. 从相机预览表面获取原始数据图像(参见 Camera.setPreviewCallback())
  2. 使用 android.media.MediaCodec 对视频进行编码
  3. 然后使用 OutputFilStream 写入文件。

这将为您提供所需的灵活性,因为在这种情况下,您在应用程序中决定哪些帧进入编码器,哪些不进入。但是,对于您的特定项目来说,这可能是一种过度杀伤,并且可能会出现一些性能问题。

PS。哦,顺便说一下,试试看一下 MediaMuxer - 也许它也可以帮助你。developer.android.com/reference/android/media/MediaMuxer.html

于 2014-11-13T07:14:27.460 回答