【发布时间】:2019-11-07 09:26:40
【问题描述】:
我想在视频录制开启时每 5 秒保存一次视频。
我尝试了许多解决方案,但我遇到了一个故障,即最后保存的帧在预览中保留了大约 300 毫秒。
我认为原因在于 MediaRecorder 类 “一旦停止了记录器,就需要在重新启动之前对其进行完全重新配置和准备。”
谢谢
【问题讨论】:
标签: android video video-capture video-recording saving-data
我想在视频录制开启时每 5 秒保存一次视频。
我尝试了许多解决方案,但我遇到了一个故障,即最后保存的帧在预览中保留了大约 300 毫秒。
我认为原因在于 MediaRecorder 类 “一旦停止了记录器,就需要在重新启动之前对其进行完全重新配置和准备。”
谢谢
【问题讨论】:
标签: android video video-capture video-recording saving-data
我认为MediaRecorder 不可能做到这一点。更好的方法是使用MediaCodec 对视频进行编码,并使用MediaMuxer 存储编码的内容。
Grafika 是 Google Github 帐户上的一个项目,它是 Android 图形和媒体黑客的垃圾场。在这个项目中,您可以找到同时使用 MediaCodec 和 MediaMuxer 类的好例子。
我分叉了Grafika 项目并进行了一些修改以支持顺序分段录制。你可以找到它here。运行应用程序时,从列表中选择Show + capture camera 项目,然后将Output Segment Duration 例如设置为5,然后按Start recording 按钮。
请查看VideoEncoderCore 和CameraCaptureActivity 类源代码以了解其工作原理。您可以找到 here 它如何将实时摄像头信息分割到不同的文件。
【讨论】:
"我认为原因在于 MediaRecorder 类,
"Once a recorder has been stopped, it will need to be completely reconfigured and prepared before being restarted"。"
您可以使用多个mediaMuxer 对单独的文件进行编码。
相机应该发送数据来填充一个 MediaMuxer 对象(它本身会产生一个.mp4 文件)。
需要时,您可以开始将相机数据写入第二个(不同的)MediaMuxer,从而自动创建第二个新的.mp4 文件(在开始使用复用器时)。
然后第一个 MediaMuxer 可以关闭并保存其文件。您的第一个片段已准备就绪...
如果需要,请尝试研究此代码以获取有关使用 Camera 和 mediaMuxer 的指南:
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();
PS:
另一种选择是使用 Threads 来运行多个 MediaRecorder。它可能对您的情况有所帮助。
请参阅 Android Background Process 指南。
【讨论】: