android – 以编程方式暂停媒体记录器.来自三星galaxy的Camera.apk有`this.mMediaRecorder.pause();`在我的代码中不起作用

现在,我使用mp4parser库建立了一个连接2个视频的库.

有了这个,我可以暂停并恢复录制视频(在录制第二个视频后,它会将其附加到第一个视频).

现在,我的老板告诉我做一个包装器,并将其用于没有硬件支持暂停视频的手机.对于拥有它的手机(三星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();
}

}

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

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

最佳答案

If I try this.mMediaRecorder.pause();

MediaRecorder类没有pause()函数,因此很明显在此特定设备上有一个自定义MediaRecorder类.这不是什么不寻常的事情,因为OEM需要的唯一办法是在设备上传递“android兼容性测试”;添加功能没有限制.

Is it possible to take the input stream of the second video (while
recording it), and directly append this data to my first video?

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

基本上你可以做什么:

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

这将为您提供所需的灵活性,因为在这种情况下,您在应用程序中决定哪些帧进入编码器,哪些不进入编码器.
但是,对于您的特定项目而言,这可能是一种过度杀伤,以及一些性能问题可能会上升.

PS.哦,顺便说一句,试试看看MediaMuxer – 也许它也可以帮到你. developer.android.com/reference/android/media/MediaMuxer.html

点赞