91145


Taro
YoshinoさんのGithubで公開されているライブラリィを利用して、静止画を繰り返し撮影して動画ファイルに変換してSDカードに保存するスケッチを試してみました。  
QVGAサイズで、5fpsしか速度が出ませんでした。  
以前、SPRESENSE勉強会#1で、アドバイスのあった１frame撮影前後でのカメラのStart/Stopを止めても、変わりませんでした。他に、高速化する方法はありますか？


CC BY-SA 4.0
2022-09-14T05:55:24.160
91100
2022-09-17T13:30:12.157
54390
question
spresense
動画撮影の高速化


ライブラリをご使用いただきありがとうございます。フレームレートとは関係ないのですが、バグを見つけてしまいましたので改めてダウンロードしてご使用ください。（AVIヘッダーの更新に問題がありました）

<https://github.com/YoshinoTaro/AviLibrary_Arduino>

さて、フレームレートが出ない件ですが、一つの原因として、774RRさんのご指摘の通り、SDカードの速度が遅いことが考えられます。少なくとも物理フォーマットした直後のSDカードで試してみてください。

あと、サンプルのコードですがタイムラプスで使用することを想定していたため、あまりフレームレートは出ません。SPRESENSEのカメラはストリーミング機能があるので、そちらを活用すれば、20フレーム以上は出ると思います。サンプルのコードを以下に示します。

[code]

    #include <Camera.h>
    #include <SDHCI.h>
    #include "AviLibrary.h"
    
    SDClass theSD;
    File aviFile;
    
    AviLibrary theAvi;
    
    String filename = "movie.avi";
    
    void CamCB(CamImage img) {
      const static uint32_t recording_time_in_ms = 10000;  /* msec */
      static uint32_t start_time = millis();
    
      if (img.isAvailable()) {
       uint32_t duration = millis() - start_time;
        if (duration > recording_time_in_ms) {
          theAvi.endRecording();
          theAvi.end();
          Serial.println("Movie saved");
          Serial.println(" Movie width:    " + String(theAvi.getWidth()));
          Serial.println(" Movie height:   " + String(theAvi.getHeight()));
          Serial.println(" File size (kB): " + String(theAvi.getFileSize()));
          Serial.println(" Captured Frame: " + String(theAvi.getTotalFrame())); 
          Serial.println(" Duration (sec): " + String(theAvi.getDuration()));
          Serial.println(" Frame per sec : " + String(theAvi.getFps()));
          Serial.println(" Max data rate : " + String(theAvi.getMaxDataRate()));
          theCamera.end();
          while (true) {
            digitalWrite(LED0, HIGH);
            delay(100);
            digitalWrite(LED0, LOW);
            delay(100);
          }
        } else {  
          theAvi.addFrame(img.getImgBuff(), img.getImgSize());
        }
      }
    }
    
    
    void setup() {
      Serial.begin(115200);
      while (!theSD.begin()) { Serial.println("insert SD card"); }
    
      const int buff_num = 2;
      theCamera.begin(buff_num, CAM_VIDEO_FPS_30 
        ,CAM_IMGSIZE_QVGA_H ,CAM_IMGSIZE_QVGA_V ,CAM_IMAGE_PIX_FMT_JPG ,5);
    
      theSD.remove(filename);
      aviFile = theSD.open(filename, FILE_WRITE);
    
      theAvi.begin(aviFile, CAM_IMGSIZE_QVGA_H, CAM_IMGSIZE_QVGA_V);
      theCamera.startStreaming(true, CamCB);
    
      Serial.println("Start recording...");
      theAvi.startRecording();
    }
    
    void loop() {}
    
[/code]

物理フォーマット直後の ScanDisk
のSDカードに10秒間録画して30fps出ました。一方、TencentのSDカードを同じ条件で試してみたところ、27fps
で頻繁にコマ落ちしていました。SDカードのメーカーによってパフォーマンスは異なるようですので、様々なメーカーのSDカードを試してみて安定して録画できるものを選んだほうがよさそうです。


CC BY-SA 4.0
2022-09-17T13:24:41.410
91145
2022-09-17T13:30:12.157
2022-09-17T13:30:12.157
27334
27334
91100
answer