【问题标题】:Save video in every 5 second interval while video recoding is ON (Android OS)视频录制开启时每 5 秒保存一次视频(Android 操作系统)
【发布时间】:2019-11-07 09:26:40
【问题描述】:

我想在视频录制开启时每 5 秒保存一次视频。

我尝试了许多解决方案,但我遇到了一个故障,即最后保存的帧在预览中保留了大约 300 毫秒。

我认为原因在于 MediaRecorder 类 “一旦停止了记录器,就需要在重新启动之前对其进行完全重新配置和准备。”

谢谢

【问题讨论】:

    标签: android video video-capture video-recording saving-data


    【解决方案1】:

    我认为MediaRecorder 不可能做到这一点。更好的方法是使用MediaCodec 对视频进行编码,并使用MediaMuxer 存储编码的内容。

    Grafika 是 Google Github 帐户上的一个项目,它是 Android 图形和媒体黑客的垃圾场。在这个项目中,您可以找到同时使用 MediaCodecMediaMuxer 类的好例子。

    我分叉了Grafika 项目并进行了一些修改以支持顺序分段录制。你可以找到它here。运行应用程序时,从列表中选择Show + capture camera 项目,然后将Output Segment Duration 例如设置为5,然后按Start recording 按钮。

    请查看VideoEncoderCoreCameraCaptureActivity 类源代码以了解其工作原理。您可以找到 here 它如何将实时摄像头信息分割到不同的文件。

    【讨论】:

    • Mir Milad Hosseiny,您的代码非常适合在运行时切片视频,但它不会录制声音。是否也可以录制声音?
    • @NilsHolgerson 查看this 示例项目。它可能会有所帮助。
    • @MirMiladHosseiny 非常感谢它正在工作!
    【解决方案2】:

    "我认为原因在于 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 可以关闭并保存其文件。您的第一个片段已准备就绪...

    如果需要,请尝试研究此代码以获取有关使用 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();
    

    PS:

    另一种选择是使用 Threads 来运行多个 MediaRecorder。它可能对您的情况有所帮助。
    请参阅 Android Background Process 指南。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多