在Android操作系统上,在视频录制时每5秒间隔保存一次视频。

5
我希望在视频录制时每隔5秒保存一次视频。
我尝试了很多解决方案,但是我遇到了一个“故障”,就是最后保存的帧在预览中会停留约300毫秒。
我认为原因在于MediaRecorder类的“一旦录制器被停止,它就需要完全重新配置和准备才能重新启动”。
谢谢。
2个回答

3
我认为使用MediaRecorder实现这一点是不可能的。更好的方法可能是通过使用MediaCodec对视频进行编码,然后使用MediaMuxer存储已编码内容。

Grafika是谷歌Github账户上的一个项目,是Android图形和媒体技术的实验室。在此项目中,您可以找到使用MediaCodecMediaMuxer类的良好示例。

我派生了Grafika项目,并做了一些修改以支持连续分段录制。您可以在这里找到它。运行应用程序后,从列表中选择Show + capture camera选项,然后将Output Segment Duration设置为5,然后按Start recording按钮。

请参考VideoEncoderCoreCameraCaptureActivity类源代码,以了解其工作原理。您可以在这里找到它是如何将实时摄像头视频流分段到不同文件中的。

Mir Milad Hosseiny,你的代码在运行时切割视频非常棒,但是它没有录制声音。是否有可能也录制声音? - NilsHolgerson
@NilsHolgerson 看看这个示例项目,它可能会有所帮助。 - Mir Milad Hosseiny
@Uriel Frankel,你能分享一下你的工作代码的输入吗? - mahesh
@mahesh,“here”链接正是我所做的。 - Uriel Frankel

0

"我认为原因在于MediaRecorder类中,"一旦录制器停止,它需要在重新启动之前进行完全的重新配置和准备""

您可以使用多个mediaMuxer来编码单独的文件。

  • 相机应该发送数据以填充一个MediaMuxer对象(它本身会生成一个.mp4文件)。

  • 当需要时,您可以开始将相机数据写入第二个(不同的)MediaMuxer,从而自动创建第二个新的.mp4文件(在使用复用器时开始)。

  • 第一个MediaMuxer然后可以关闭并保存其文件。你的第一部分已经准备好了...

如果需要,可以尝试学习此代码作为使用CameramediaMuxer的指南:
https://bigflake.com/mediacodec/CameraToMpegTest.java.txt

所以你有一个处理5秒间隔已过的函数?在那个函数中,可以在两个复用器之间循环记录,给其中一个关闭文件的机会,而另一个记录下一个片段,然后反之亦然。

与以下类似的东西不同(使用MediaRecorder.OutputFormat.MPEG_4):

this.mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);

你需要创建一个新的复用器(使用MUXER_OUTPUT_MPEG_4):
//# create a new File to ssave into
File outputFile = new File(OUTPUT_FILENAME_DIR, "/yourFolder/Segment" + "-" + mySegmentNum + ".mp4");
String outputPath = outputFile.toString();
int format = MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4;

try { mMuxer = new MediaMuxer(outputPath, format); } 
catch (IOException e) { Log.e(TAG, e.getLocalizedMessage()); }

你可以使用以下命令停止复用器:

mMuxer1.stop(); mMuxer1.release();

提示:

另一种选择是使用线程来运行多个MediaRecorder。这可能有助于您的情况。
请参阅Android 后台进程指南。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接