diff --git a/Capture/README.md b/Capture/README.md index dfc42a8..69c6168 100644 --- a/Capture/README.md +++ b/Capture/README.md @@ -7,11 +7,19 @@ USB Capture devices and save it to a file. It is a part of the ReproStim project ## Dependencies -On Debian: +### On Debian: apt-get install -y ffmpeg libudev-dev libasound-dev libv4l-dev libyaml-cpp-dev libspdlog-dev catch2 v4l-utils libopencv-dev libcurl4-openssl-dev nlohmann-json3-dev cmake g++ -Project requirements: +Optionally, in case `con/duct` tool is used and `conduct_opts.enabled` is set to true in reprostim-videocapture `config.yaml`: + + apt-get install -y python3-pip + python3 -m venv venv + source venv/bin/activate + pip install con-duct + duct --version + +### Project requirements: - OS Linux - g++ (C++20) - CMake 3.10+ @@ -29,6 +37,8 @@ Project requirements: - catch2 - v4l-utils - ffmpeg + - pip+con/duct (optional) + diff --git a/Capture/capturelib/include/reprostim/CaptureApp.h b/Capture/capturelib/include/reprostim/CaptureApp.h index c5193a2..33114bd 100644 --- a/Capture/capturelib/include/reprostim/CaptureApp.h +++ b/Capture/capturelib/include/reprostim/CaptureApp.h @@ -20,6 +20,13 @@ namespace reprostim { } #endif // _NOTIFY_REPROMON + // optional con/duct options + struct ConductOpts { + bool enabled = false; + std::string cmd; + std::string duct_bin; + }; + struct FfmpegOpts { std::string a_fmt; std::string a_nchan; @@ -49,6 +56,7 @@ namespace reprostim { LogLevel session_logger_level = LogLevel::OFF; std::string session_logger_pattern; std::string video_device_path_pattern; + ConductOpts conduct_opts; RepromonOpts repromon_opts; FfmpegOpts ffm_opts; }; @@ -113,6 +121,7 @@ namespace reprostim { SessionLogger_ptr createSessionLogger(const std::string& name, const std::string& filePath); void listDevices(const std::string& devices); virtual bool loadConfig(AppConfig& cfg, const std::string& pathConfig); + virtual void onCaptureIdle(); virtual void onCaptureStart(); virtual void onCaptureStop(const std::string& message); virtual bool onLoadConfig(AppConfig& cfg, const std::string& pathConfig, YAML::Node doc); @@ -123,6 +132,9 @@ namespace reprostim { int run(int argc, char* argv[]); }; + // methods + int checkConduct(const ConductOpts& opts); + // inline methods inline void CaptureApp::disconnDevAdd(const std::string& devPath) { diff --git a/Capture/capturelib/src/CaptureApp.cpp b/Capture/capturelib/src/CaptureApp.cpp index 298b107..3d98c01 100644 --- a/Capture/capturelib/src/CaptureApp.cpp +++ b/Capture/capturelib/src/CaptureApp.cpp @@ -8,6 +8,24 @@ namespace reprostim { + int checkConduct(const ConductOpts& opts) { + if (!opts.enabled) { + _VERBOSE("Conduct monitoring is disabled"); + return EX_OK; + } + std::string cmd = opts.duct_bin + " --version"; + std::string res = exec(cmd); + if (res.empty() || !res.starts_with("duct ")) { + _ERROR("con/duct utility not found. Please make sure it's installed with 'pip install con-duct'"); + _ERROR(" and configured correctly in config.yaml -> conduct_opts -> duct_bin ."); + _ERROR(" COMMAND : " << cmd); + _ERROR(" RESULT : " << res); + return EX_UNAVAILABLE; + } + _VERBOSE("con/duct utility found: " << res); + return EX_OK; + } + void signalHandler(int signum) { //_INFO("Signal received: " << signum); if (signum == SIGINT) { @@ -190,6 +208,15 @@ namespace reprostim { opts.out_fmt = node["out_fmt"].as(); } + // load conduct_opts + if( doc["conduct_opts"] ) { + YAML::Node node = doc["conduct_opts"]; + ConductOpts& opts = cfg.conduct_opts; + opts.enabled = node["enabled"].as(); + opts.cmd = node["cmd"].as(); + opts.duct_bin = node["duct_bin"].as(); + } + // load repromon_opts if( doc["repromon_opts"] ) { YAML::Node node = doc["repromon_opts"]; @@ -218,6 +245,9 @@ namespace reprostim { return this->onLoadConfig(cfg, pathConfig, doc); } + void CaptureApp::onCaptureIdle() { + } + void CaptureApp::onCaptureStart() { _INFO("TODO: onCaptureStart"); } @@ -299,6 +329,12 @@ namespace reprostim { return res2; } + const int res3 = checkConduct(cfg.conduct_opts); + if( res3!=EX_OK ) { + // problem with con/duct configuration or installation + return res3; + } + // start repromon queue if( cfg.repromon_opts.enabled ) { fRepromonEnabled = true; @@ -462,7 +498,8 @@ namespace reprostim { else { if( !vssEquals(vssCur, vssPrev) ) { onCaptureStop(":\tStopped recording because something changed."); - } + } else + onCaptureIdle(); // hook to check capture cycle } } else { diff --git a/Capture/capturelib/src/CaptureLog.cpp b/Capture/capturelib/src/CaptureLog.cpp index 5bd3c3a..76a5152 100644 --- a/Capture/capturelib/src/CaptureLog.cpp +++ b/Capture/capturelib/src/CaptureLog.cpp @@ -87,7 +87,7 @@ namespace reprostim { { // Create a logger with two sinks: stdout and file auto console_sink = std::make_shared(); - auto file_sink = std::make_shared(filePath, true); + auto file_sink = std::make_shared(filePath, false); // Create a logger with the two sinks auto logger = std::make_shared(name, @@ -116,8 +116,8 @@ namespace reprostim { spdlog::register_logger(logger); // Redirect stdout to the file - freopen(filePath.c_str(), "w", stdout); - freopen(filePath.c_str(), "w", stderr); + freopen(filePath.c_str(), "a", stdout); + freopen(filePath.c_str(), "a", stderr); //logger->sinks().push_back(console_sink); g_pGlobalLogger = logger; } diff --git a/Capture/research/ffmpeg_enc/ffmpeg_enc.sh b/Capture/research/ffmpeg_enc/ffmpeg_enc.sh new file mode 100755 index 0000000..303755e --- /dev/null +++ b/Capture/research/ffmpeg_enc/ffmpeg_enc.sh @@ -0,0 +1,60 @@ +#!/bin/bash + +#set VDEV=/dev/video1 +#set MKV=./1.mkv + +#echo "Test 1" + +#rm $MKV +#ffmpeg -f v4l2 -input_format yuyv422 -framerate 60 -video_size 1920x1080 -thread_queue_size 40960 -i $VDEV -c:v libx264 -flush_packets 1 -an $MKV + +#ffmpeg -f alsa -ac 2 -thread_queue_size 4096 -i hw:1,1 + # -f v4l2 -input_format yuyv422 -framerate 60 -video_size 1920x1080 -thread_queue_size 4096 + # -i /dev/video0 -c:v libx264 -flush_packets 1 + # -acodec aac ./1.mkv 2>&1 + +# Simple 15 sec video capture with no audio +#echo "Test 001" +#rm output001.mp4 +#/usr/bin/time -v ffmpeg -f v4l2 -framerate 60 -video_size 1920x1080 -t 15 -i /dev/video0 -an output001.mp4 + +# Simple 15 sec video capture with no audio and x264 codec +#echo "Test 002" +#rm output002.mp4 +#/usr/bin/time -v ffmpeg -f v4l2 -framerate 60 -video_size 1920x1080 -t 15 -i /dev/video0 -c:v libx264 -an output002.mp4 + +# Simple video capture with audio and video and start time set to 0 for both audio and video +#echo "Test 003" +#rm output003.mp4 +#ffmpeg -f alsa -ac 2 -thread_queue_size 4096 -i hw:1,1 -f v4l2 -framerate 60 -video_size 1920x1080 -i /dev/video0 -c:v libx264 -acodec aac -vf setpts=PTS-STARTPTS -af asetpts=PTS-STARTPTS output003.mp4 + +# video capture with x264 optimizations: fast 2M bit rate +#echo "Test 004" +#rm output004.mp4 +#/usr/bin/time -v ffmpeg -f alsa -t 15 -ac 2 -thread_queue_size 4096 -i hw:1,1 -f v4l2 -t 15 -framerate 60 -video_size 1920x1080 -i /dev/video0 -c:v libx264 -b:v 2M -preset fast -acodec aac -vf setpts=PTS-STARTPTS -af asetpts=PTS-STARTPTS output004.mp4 + +# video capture with x264 optimizations: ultrafast +#echo "Test 005" +#rm output005.mp4 +#/usr/bin/time -v ffmpeg -f alsa -t 15 -ac 2 -thread_queue_size 4096 -i hw:1,1 -f v4l2 -t 15 -framerate 60 -video_size 1920x1080 -i /dev/video0 -c:v libx264 -b:v 2M -preset ultrafast -acodec aac -vf setpts=PTS-STARTPTS -af asetpts=PTS-STARTPTS output005.mp4 + +# video capture with x264 optimizations: ultrafast, crf=18 r-60? +#echo "Test 006" +#rm output006.mp4 +#/usr/bin/time -v ffmpeg -f alsa -t 15 -ac 2 -thread_queue_size 4096 -i hw:1,1 -f v4l2 -t 15 -framerate 60 -video_size 1920x1080 -i /dev/video0 -c:v libx264 -r 60 -b:v 2M -preset ultrafast -crf 18 -acodec aac -vf setpts=PTS-STARTPTS -af asetpts=PTS-STARTPTS output006.mp4 + +# video capture with x264 optimizations: ultrafast, crf=18 zerolatency +# 470M/hour +#echo "Test 007" +#rm output007.mp4 +#/usr/bin/time -v ffmpeg -f alsa -t 600 -ac 2 -thread_queue_size 4096 -i hw:1,1 -f v4l2 -t 600 -framerate 60 -video_size 1920x1080 -i /dev/video0 -c:v libx264 -flush_packets 1 -preset ultrafast -crf 18 -r 60 -tune zerolatency -b:v 2M -maxrate 2M -bufsize 4M -acodec aac -vf setpts=PTS-STARTPTS -af asetpts=PTS-STARTPTS output007.mp4 + +# video capture with x264 optimizations: ultrafast, crf=18 zerolatency +#echo "Test 008" +#rm output008.mp4 +#/usr/bin/time -v ffmpeg -f alsa -t 15 -ac 2 -thread_queue_size 4096 -i hw:1,1 -f v4l2 -t 15 -framerate 60 -video_size 1920x1080 -i /dev/video0 -c:v libx264 -flush_packets 1 -preset ultrafast -crf 18 -r 60 -tune zerolatency -b:v 2M -maxrate 2M -bufsize 4M -acodec aac -vf setpts=PTS-STARTPTS -af asetpts=PTS-STARTPTS output008.mp4 + +# video capture similar to initial one we have before changes +echo "Test 009" +rm output009.mp4 +/usr/bin/time -v ffmpeg -f alsa -t 15 -ac 2 -thread_queue_size 4096 -i hw:1,1 -f v4l2 -t 15 -input_format yuyv422 -framerate 60 -video_size 1920x1080 -thread_queue_size 4096 -i /dev/video0 -c:v libx264 -flush_packets 1 output009.mkv diff --git a/Capture/research/ffmpeg_enc/results.txt b/Capture/research/ffmpeg_enc/results.txt new file mode 100644 index 0000000..ab1af81 --- /dev/null +++ b/Capture/research/ffmpeg_enc/results.txt @@ -0,0 +1,174 @@ +#001 +Command being timed: "ffmpeg -f v4l2 -framerate 60 -video_size 1920x1080 -t 15 -i /dev/video0 -an output001.mp4" + User time (seconds): 43.02 + System time (seconds): 1.53 + Percent of CPU this job got: 287% + Elapsed (wall clock) time (h:mm:ss or m:ss): 0:15.47 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 903284 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 30993 + Voluntary context switches: 26455 + Involuntary context switches: 2409 + Swaps: 0 + File system inputs: 0 + File system outputs: 768 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + +#002 + Command being timed: "ffmpeg -f v4l2 -framerate 60 -video_size 1920x1080 -t 15 -i /dev/video0 -c:v libx264 -an output002.mp4" + User time (seconds): 43.84 + System time (seconds): 1.68 + Percent of CPU this job got: 293% + Elapsed (wall clock) time (h:mm:ss or m:ss): 0:15.49 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 897268 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 30973 + Voluntary context switches: 25319 + Involuntary context switches: 2829 + Swaps: 0 + File system inputs: 0 + File system outputs: 552 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + +#004 + Command being timed: "ffmpeg -f alsa -t 15 -ac 2 -thread_queue_size 4096 -i hw:1,1 -f v4l2 -t 15 -framerate 60 -video_size 1920x1080 -i /dev/video0 -c:v libx264 -b:v 2M -preset fast -acodec aac -vf setpts=PTS-STARTPTS -af asetpts=PTS-STARTPTS output004.mp4" + User time (seconds): 51.62 + System time (seconds): 1.73 + Percent of CPU this job got: 340% + Elapsed (wall clock) time (h:mm:ss or m:ss): 0:15.65 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 810976 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 27510 + Voluntary context switches: 29507 + Involuntary context switches: 4373 + Swaps: 0 + File system inputs: 0 + File system outputs: 7416 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + +#005 +Command being timed: "ffmpeg -f alsa -t 15 -ac 2 -thread_queue_size 4096 -i hw:1,1 -f v4l2 -t 15 -framerate 60 -video_size 1920x1080 -i /dev/video0 -c:v libx264 -b:v 2M -preset ultrafast -acodec aac -vf setpts=PTS-STARTPTS -af asetpts=PTS-STARTPTS output005.mp4" + User time (seconds): 21.69 + System time (seconds): 1.79 + Percent of CPU this job got: 153% + Elapsed (wall clock) time (h:mm:ss or m:ss): 0:15.34 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 392000 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 15641 + Voluntary context switches: 19262 + Involuntary context switches: 926 + Swaps: 0 + File system inputs: 0 + File system outputs: 7320 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + +#006 +Command being timed: "ffmpeg -f alsa -t 15 -ac 2 -thread_queue_size 4096 -i hw:1,1 -f v4l2 -t 15 -framerate 60 -video_size 1920x1080 -i /dev/video0 -c:v libx264 -b:v 2M -preset ultrafast -crf 18 -acodec aac -vf setpts=PTS-STARTPTS -af asetpts=PTS-STARTPTS output006.mp4" + User time (seconds): 21.57 + System time (seconds): 1.20 + Percent of CPU this job got: 148% + Elapsed (wall clock) time (h:mm:ss or m:ss): 0:15.33 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 391756 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 15629 + Voluntary context switches: 19737 + Involuntary context switches: 746 + Swaps: 0 + File system inputs: 0 + File system outputs: 3584 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + +#007 +Command being timed: "ffmpeg -f alsa -t 15 -ac 2 -thread_queue_size 4096 -i hw:1,1 -f v4l2 -t 15 -framerate 60 -video_size 1920x1080 -i /dev/video0 -c:v libx264 -preset ultrafast -crf 18 -r 60 -tune zerolatency -b:v 2M -maxrate 2M -bufsize 4M -acodec aac -vf setpts=PTS-STARTPTS -af asetpts=PTS-STARTPTS output007.mp4" + User time (seconds): 25.16 + System time (seconds): 1.19 + Percent of CPU this job got: 172% + Elapsed (wall clock) time (h:mm:ss or m:ss): 0:15.30 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 235288 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 8124 + Voluntary context switches: 36576 + Involuntary context switches: 1681 + Swaps: 0 + File system inputs: 0 + File system outputs: 2952 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + +#009 + Command being timed: "ffmpeg -f alsa -t 15 -ac 2 -thread_queue_size 4096 -i hw:1,1 -f v4l2 -t 15 -input_format yuyv422 -framerate 60 -video_size 1920x1080 -thread_queue_size 4096 -i /dev/video0 -c:v libx264 -flush_packets 1 output009.mkv" + User time (seconds): 49.37 + System time (seconds): 6.06 + Percent of CPU this job got: 252% + Elapsed (wall clock) time (h:mm:ss or m:ss): 0:21.99 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 4146316 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 58 + Minor (reclaiming a frame) page faults: 1174653 + Voluntary context switches: 32669 + Involuntary context switches: 88676 + Swaps: 0 + File system inputs: 15048 + File system outputs: 960 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 diff --git a/Capture/research/ffmpeg_enc/video_size_2024_07.jsonl b/Capture/research/ffmpeg_enc/video_size_2024_07.jsonl new file mode 100644 index 0000000..2bb7219 --- /dev/null +++ b/Capture/research/ffmpeg_enc/video_size_2024_07.jsonl @@ -0,0 +1,107 @@ +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.01.11.07.08.392_2024.07.01.11.14.27.173.mkv","rate_mbpm":4.5,"duration_sec":438.8,"size_mb":33.2} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.01.15.32.02.890_2024.07.01.18.47.57.311.mkv","rate_mbpm":3.2,"duration_sec":11754.4,"size_mb":623.5} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.08.31.14.507_2024.07.02.08.45.37.312.mkv","rate_mbpm":2.3,"duration_sec":862.8,"size_mb":32.8} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.09.36.59.192_2024.07.02.09.39.06.832.mkv","rate_mbpm":3.7,"duration_sec":127.6,"size_mb":7.9} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.09.39.12.583_2024.07.02.09.42.29.615.mkv","rate_mbpm":1.3,"duration_sec":197.0,"size_mb":4.1} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.09.42.35.334_2024.07.02.09.47.48.468.mkv","rate_mbpm":8.2,"duration_sec":313.1,"size_mb":42.6} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.09.47.53.780_2024.07.02.09.56.06.836.mkv","rate_mbpm":7.5,"duration_sec":493.1,"size_mb":61.4} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.10.07.14.930_2024.07.02.10.07.21.924.mkv","rate_mbpm":12.4,"duration_sec":7.0,"size_mb":1.4} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.10.07.27.289_2024.07.02.10.07.39.467.mkv","rate_mbpm":8.0,"duration_sec":12.2,"size_mb":1.6} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.10.07.44.846_2024.07.02.10.13.50.757.mkv","rate_mbpm":6.5,"duration_sec":365.9,"size_mb":39.4} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.10.13.56.456_2024.07.02.10.18.15.001.mkv","rate_mbpm":6.2,"duration_sec":258.5,"size_mb":26.7} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.10.18.20.446_2024.07.02.10.22.58.656.mkv","rate_mbpm":6.9,"duration_sec":278.2,"size_mb":32.1} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.10.23.20.326_2024.07.02.10.23.27.241.mkv","rate_mbpm":5.1,"duration_sec":6.9,"size_mb":0.6} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.10.23.38.781_2024.07.02.10.23.47.761.mkv","rate_mbpm":5.8,"duration_sec":9.0,"size_mb":0.9} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.13.51.51.479_2024.07.02.13.51.58.437.mkv","rate_mbpm":10.4,"duration_sec":7.0,"size_mb":1.2} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.13.52.03.817_2024.07.02.13.53.34.385.mkv","rate_mbpm":9.6,"duration_sec":90.6,"size_mb":14.5} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.14.02.33.668_2024.07.02.14.02.40.658.mkv","rate_mbpm":11.2,"duration_sec":7.0,"size_mb":1.3} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.14.02.46.004_2024.07.02.14.04.55.840.mkv","rate_mbpm":8.7,"duration_sec":129.8,"size_mb":18.8} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.14.05.01.122_2024.07.02.14.05.17.230.mkv","rate_mbpm":6.2,"duration_sec":16.1,"size_mb":1.7} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.14.05.22.713_2024.07.02.14.05.29.339.mkv","rate_mbpm":10.8,"duration_sec":6.6,"size_mb":1.2} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.14.05.35.035_2024.07.02.14.05.43.788.mkv","rate_mbpm":5.7,"duration_sec":8.8,"size_mb":0.8} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.14.05.49.456_2024.07.02.14.07.06.126.mkv","rate_mbpm":9.5,"duration_sec":76.7,"size_mb":12.1} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.14.07.11.556_2024.07.02.14.11.00.688.mkv","rate_mbpm":5.3,"duration_sec":229.1,"size_mb":20.4} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.14.15.35.285_2024.07.02.14.15.41.958.mkv","rate_mbpm":9.4,"duration_sec":6.7,"size_mb":1.0} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.14.15.47.627_2024.07.02.14.15.56.522.mkv","rate_mbpm":6.3,"duration_sec":8.9,"size_mb":0.9} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.14.16.02.030_2024.07.02.14.16.11.161.mkv","rate_mbpm":8.7,"duration_sec":9.1,"size_mb":1.3} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.14.16.16.455_2024.07.02.14.18.07.020.mkv","rate_mbpm":5.5,"duration_sec":110.6,"size_mb":10.1} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.14.18.12.692_2024.07.02.14.18.19.411.mkv","rate_mbpm":12.2,"duration_sec":6.7,"size_mb":1.4} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.14.18.25.038_2024.07.02.14.20.34.733.mkv","rate_mbpm":6.2,"duration_sec":129.7,"size_mb":13.4} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.14.20.40.228_2024.07.02.14.20.48.923.mkv","rate_mbpm":4.9,"duration_sec":8.7,"size_mb":0.7} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.14.20.54.601_2024.07.02.14.25.21.241.mkv","rate_mbpm":5.0,"duration_sec":266.6,"size_mb":22.1} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.14.25.49.483_2024.07.02.14.29.41.363.mkv","rate_mbpm":5.1,"duration_sec":231.9,"size_mb":19.7} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.14.29.47.079_2024.07.02.14.34.16.709.mkv","rate_mbpm":5.3,"duration_sec":269.6,"size_mb":23.8} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.14.34.21.769_2024.07.02.14.35.20.782.mkv","rate_mbpm":5.4,"duration_sec":59.0,"size_mb":5.3} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.14.35.26.317_2024.07.02.14.52.49.182.mkv","rate_mbpm":6.7,"duration_sec":1042.9,"size_mb":116.0} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.17.41.09.789_2024.07.02.17.41.16.699.mkv","rate_mbpm":8.0,"duration_sec":6.9,"size_mb":0.9} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.17.41.22.177_2024.07.02.17.44.48.121.mkv","rate_mbpm":4.1,"duration_sec":205.9,"size_mb":14.0} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.18.38.29.081_2024.07.02.18.38.36.024.mkv","rate_mbpm":9.0,"duration_sec":6.9,"size_mb":1.0} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.18.38.41.430_2024.07.02.18.39.58.104.mkv","rate_mbpm":8.0,"duration_sec":76.7,"size_mb":10.2} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.18.40.03.520_2024.07.02.18.40.10.349.mkv","rate_mbpm":8.1,"duration_sec":6.8,"size_mb":0.9} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.18.40.15.847_2024.07.02.18.40.22.499.mkv","rate_mbpm":7.5,"duration_sec":6.7,"size_mb":0.8} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.18.40.28.169_2024.07.02.18.40.35.091.mkv","rate_mbpm":4.8,"duration_sec":6.9,"size_mb":0.6} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.18.40.40.507_2024.07.02.18.41.15.733.mkv","rate_mbpm":4.0,"duration_sec":35.2,"size_mb":2.3} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.18.41.21.498_2024.07.02.18.41.28.015.mkv","rate_mbpm":5.9,"duration_sec":6.5,"size_mb":0.6} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.18.41.33.818_2024.07.02.18.41.40.326.mkv","rate_mbpm":5.7,"duration_sec":6.5,"size_mb":0.6} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.18.41.46.127_2024.07.02.18.41.52.646.mkv","rate_mbpm":5.3,"duration_sec":6.5,"size_mb":0.6} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.18.41.58.463_2024.07.02.18.42.20.554.mkv","rate_mbpm":3.8,"duration_sec":22.1,"size_mb":1.4} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.18.42.26.182_2024.07.02.18.43.57.403.mkv","rate_mbpm":8.8,"duration_sec":91.2,"size_mb":13.4} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.18.44.02.742_2024.07.02.18.44.09.152.mkv","rate_mbpm":2.6,"duration_sec":6.4,"size_mb":0.3} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.18.44.15.075_2024.07.02.18.55.34.289.mkv","rate_mbpm":7.6,"duration_sec":679.2,"size_mb":86.0} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.18.55.40.890_2024.07.02.18.55.47.275.mkv","rate_mbpm":1.9,"duration_sec":6.4,"size_mb":0.2} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.18.55.53.217_2024.07.02.19.02.15.647.mkv","rate_mbpm":2.4,"duration_sec":382.4,"size_mb":15.6} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.19.02.21.556_2024.07.02.19.04.36.291.mkv","rate_mbpm":3.3,"duration_sec":134.7,"size_mb":7.5} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.19.04.41.944_2024.07.02.19.05.45.886.mkv","rate_mbpm":4.8,"duration_sec":63.9,"size_mb":5.1} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.19.05.51.625_2024.07.02.19.07.10.210.mkv","rate_mbpm":3.9,"duration_sec":78.6,"size_mb":5.1} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.19.07.15.806_2024.07.02.19.07.36.658.mkv","rate_mbpm":2.6,"duration_sec":20.9,"size_mb":0.9} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.19.07.42.462_2024.07.02.19.11.31.894.mkv","rate_mbpm":3.9,"duration_sec":229.4,"size_mb":14.7} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.19.12.54.201_2024.07.02.19.13.01.149.mkv","rate_mbpm":12.9,"duration_sec":6.9,"size_mb":1.5} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.19.13.06.534_2024.07.02.19.15.05.703.mkv","rate_mbpm":8.6,"duration_sec":119.2,"size_mb":17.0} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.02.19.15.34.563_2024.07.02.19.25.59.650.mkv","rate_mbpm":7.7,"duration_sec":625.1,"size_mb":80.3} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.03.12.56.29.942_2024.07.03.14.55.41.350.mkv","rate_mbpm":3.2,"duration_sec":7151.4,"size_mb":379.2} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.05.16.18.45.755_2024.07.05.16.39.33.904.mkv","rate_mbpm":5.3,"duration_sec":1248.1,"size_mb":111.1} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.08.13.59.52.525_2024.07.08.16.53.09.273.mkv","rate_mbpm":2.4,"duration_sec":10396.7,"size_mb":407.7} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.09.11.12.33.949_2024.07.09.11.12.40.870.mkv","rate_mbpm":5.8,"duration_sec":6.9,"size_mb":0.7} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.09.11.12.46.273_2024.07.09.15.11.36.867.mkv","rate_mbpm":2.5,"duration_sec":14330.6,"size_mb":597.9} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.10.13.25.43.823_2024.07.10.18.01.51.643.mkv","rate_mbpm":2.9,"duration_sec":16567.8,"size_mb":808.0} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.10.18.02.07.221_2024.07.10.18.02.13.992.mkv","rate_mbpm":4.3,"duration_sec":6.8,"size_mb":0.5} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.10.18.02.19.575_2024.07.10.18.02.41.712.mkv","rate_mbpm":1.5,"duration_sec":22.1,"size_mb":0.5} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.10.18.02.47.462_2024.07.10.21.34.03.274.mkv","rate_mbpm":2.6,"duration_sec":12675.8,"size_mb":549.6} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.11.09.33.58.885_2024.07.11.15.59.40.877.mkv","rate_mbpm":2.7,"duration_sec":23142.0,"size_mb":1046.4} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.15.10.41.51.345_2024.07.15.12.44.58.690.mkv","rate_mbpm":2.4,"duration_sec":7387.3,"size_mb":296.8} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.16.16.27.11.890_2024.07.16.18.44.42.577.mkv","rate_mbpm":2.3,"duration_sec":8250.7,"size_mb":315.4} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.16.18.56.36.686_2024.07.16.21.59.14.685.mkv","rate_mbpm":2.7,"duration_sec":10958.0,"size_mb":494.9} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.17.10.44.24.504_2024.07.17.11.54.20.534.mkv","rate_mbpm":2.1,"duration_sec":4196.0,"size_mb":146.0} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.17.16.37.59.623_2024.07.17.19.48.56.393.mkv","rate_mbpm":2.8,"duration_sec":11456.8,"size_mb":543.1} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.18-10.27.17.749--2024.07.18-10.37.13.757.mkv","rate_mbpm":4.4,"duration_sec":596.0,"size_mb":44.0} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.18-10.37.57.310--2024.07.18-10.38.04.320.mkv","rate_mbpm":4.8,"duration_sec":7.0,"size_mb":0.6} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.18-10.38.09.646--2024.07.18-11.14.31.871.mkv","rate_mbpm":3.6,"duration_sec":2182.2,"size_mb":131.4} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.18-11.14.43.394--2024.07.18-11.14.50.322.mkv","rate_mbpm":4.9,"duration_sec":6.9,"size_mb":0.6} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.18-11.14.55.734--2024.07.18-12.21.13.468.mkv","rate_mbpm":2.2,"duration_sec":3977.7,"size_mb":144.3} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.19-13.04.17.141--2024.07.19-13.55.17.605.mkv","rate_mbpm":3.4,"duration_sec":3060.5,"size_mb":173.8} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.19-14.10.50.010--2024.07.19-14.10.56.733.mkv","rate_mbpm":4.3,"duration_sec":6.7,"size_mb":0.5} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.19-14.11.02.338--2024.07.19-14.25.02.857.mkv","rate_mbpm":0.9,"duration_sec":840.5,"size_mb":12.3} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.19-14.49.37.639--2024.07.19-14.49.44.433.mkv","rate_mbpm":6.7,"duration_sec":6.8,"size_mb":0.8} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.19-14.49.49.991--2024.07.19-19.04.28.252.mkv","rate_mbpm":2.8,"duration_sec":15278.3,"size_mb":720.2} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.22-15.03.36.430--2024.07.22-17.45.24.588.mkv","rate_mbpm":2.4,"duration_sec":9708.2,"size_mb":392.6} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.23-09.33.23.922--2024.07.23-09.33.30.894.mkv","rate_mbpm":4.6,"duration_sec":7.0,"size_mb":0.5} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.23-09.33.36.271--2024.07.23-11.10.26.023.mkv","rate_mbpm":2.2,"duration_sec":5809.8,"size_mb":208.4} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.23-18.38.27.784--2024.07.23-21.34.26.162.mkv","rate_mbpm":2.1,"duration_sec":10558.4,"size_mb":365.6} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.23-21.34.59.048--2024.07.23-21.35.05.766.mkv","rate_mbpm":3.1,"duration_sec":6.7,"size_mb":0.3} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.23-21.35.11.382--2024.07.23-21.35.17.896.mkv","rate_mbpm":1.2,"duration_sec":6.5,"size_mb":0.1} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.24-17.32.09.638--2024.07.24-17.32.16.573.mkv","rate_mbpm":7.1,"duration_sec":6.9,"size_mb":0.8} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.24-17.32.21.992--2024.07.24-18.22.48.933.mkv","rate_mbpm":6.0,"duration_sec":3026.9,"size_mb":301.3} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.24-18.23.03.528--2024.07.24-18.23.10.241.mkv","rate_mbpm":3.6,"duration_sec":6.7,"size_mb":0.4} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.24-18.23.15.860--2024.07.24-18.23.37.048.mkv","rate_mbpm":1.6,"duration_sec":21.2,"size_mb":0.6} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.24-18.23.42.713--2024.07.24-20.19.51.574.mkv","rate_mbpm":2.0,"duration_sec":6968.9,"size_mb":236.7} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.25-16.30.04.978--2024.07.25-17.03.24.046.mkv","rate_mbpm":2.6,"duration_sec":1999.1,"size_mb":85.8} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.25-18.28.46.343--2024.07.26-13.02.41.598.mkv","rate_mbpm":1.3,"duration_sec":66835.3,"size_mb":1464.0} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.26-13.02.46.905--2024.07.26-14.09.13.991.mkv","rate_mbpm":2.0,"duration_sec":3987.1,"size_mb":135.3} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.27-12.31.59.399--2024.07.27-15.16.15.129.mkv","rate_mbpm":2.2,"duration_sec":9855.7,"size_mb":360.6} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.29-11.46.41.448--2024.07.29-13.05.51.619.mkv","rate_mbpm":1.5,"duration_sec":4750.2,"size_mb":121.9} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.29-13.53.51.622--2024.07.30-17.59.06.219.mkv","rate_mbpm":1.3,"duration_sec":101114.6,"size_mb":2212.4} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.30-17.59.12.000--2024.07.30-20.51.46.075.mkv","rate_mbpm":2.7,"duration_sec":10354.1,"size_mb":471.0} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.30-20.51.51.779--2024.07.31-09.53.05.070.mkv","rate_mbpm":1.3,"duration_sec":46873.3,"size_mb":1026.8} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.31-09.53.10.468--2024.07.31-10.03.38.677.mkv","rate_mbpm":2.2,"duration_sec":628.2,"size_mb":23.3} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.31-10.03.45.369--2024.07.31-10.55.01.858.mkv","rate_mbpm":2.3,"duration_sec":3076.5,"size_mb":120.2} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/07/2024.07.31-18.28.03.747--2024.07.31-20.52.31.878.mkv","rate_mbpm":2.9,"duration_sec":8668.1,"size_mb":423.1} diff --git a/Capture/research/ffmpeg_enc/video_size_2024_08.jsonl b/Capture/research/ffmpeg_enc/video_size_2024_08.jsonl new file mode 100644 index 0000000..15957a5 --- /dev/null +++ b/Capture/research/ffmpeg_enc/video_size_2024_08.jsonl @@ -0,0 +1,52 @@ +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/08/2024.08.01-13.15.11.405--2024.08.01-13.15.18.405.mkv","rate_mbpm":8.0,"duration_sec":7.0,"size_mb":0.9} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/08/2024.08.01-13.15.23.826--2024.08.01-13.34.10.436.mkv","rate_mbpm":1.6,"duration_sec":1126.6,"size_mb":29.8} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/08/2024.08.01-14.21.01.758--2024.08.02-09.42.41.121.mkv","rate_mbpm":1.3,"duration_sec":69699.4,"size_mb":1525.0} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/08/2024.08.02-09.42.46.964--2024.08.02-09.48.19.936.mkv","rate_mbpm":5.1,"duration_sec":333.0,"size_mb":28.1} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/08/2024.08.02-09.49.08.176--2024.08.02-09.49.15.315.mkv","rate_mbpm":5.0,"duration_sec":7.1,"size_mb":0.6} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/08/2024.08.02-09.49.20.533--2024.08.02-10.54.06.500.mkv","rate_mbpm":3.8,"duration_sec":3886.0,"size_mb":249.1} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/08/2024.08.02-10.54.07.679--2024.08.02-11.34.06.513.mkv","rate_mbpm":1.4,"duration_sec":2398.8,"size_mb":54.7} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/08/2024.08.02-14.16.07.866--2024.08.02-14.16.14.866.mkv","rate_mbpm":5.2,"duration_sec":7.0,"size_mb":0.6} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/08/2024.08.02-14.16.20.218--2024.08.02-14.35.35.730.mkv","rate_mbpm":3.1,"duration_sec":1155.5,"size_mb":59.3} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/08/2024.08.02-16.33.19.139--2024.08.02-18.56.29.150.mkv","rate_mbpm":3.4,"duration_sec":8590.0,"size_mb":486.2} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/08/2024.08.02-18.56.31.217--2024.08.02-20.39.20.716.mkv","rate_mbpm":2.4,"duration_sec":6169.5,"size_mb":248.3} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/08/2024.08.03-08.42.06.255--2024.08.03-10.39.00.406.mkv","rate_mbpm":2.9,"duration_sec":7014.2,"size_mb":337.2} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/08/2024.08.06-11.17.50.647--2024.08.06-19.00.14.358.mkv","rate_mbpm":3.5,"duration_sec":27743.7,"size_mb":1616.8} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/08/2024.08.07-07.17.26.195--2024.08.07-09.57.16.592.mkv","rate_mbpm":3.2,"duration_sec":9590.4,"size_mb":508.8} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/08/2024.08.08-08.50.39.040--2024.08.08-10.59.29.795.mkv","rate_mbpm":2.7,"duration_sec":7730.8,"size_mb":350.1} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/08/2024.08.09-09.40.48.277--2024.08.09-09.44.04.955.mkv","rate_mbpm":2.5,"duration_sec":196.7,"size_mb":8.2} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/08/2024.08.09-09.45.03.661--2024.08.09-09.45.10.385.mkv","rate_mbpm":1.7,"duration_sec":6.7,"size_mb":0.2} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/08/2024.08.09-09.45.15.996--2024.08.09-10.20.16.605.mkv","rate_mbpm":2.3,"duration_sec":2100.6,"size_mb":78.9} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/08/2024.08.09-10.30.47.729--2024.08.09-10.30.54.585.mkv","rate_mbpm":2.2,"duration_sec":6.9,"size_mb":0.3} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/08/2024.08.09-10.31.00.087--2024.08.09-11.03.07.318.mkv","rate_mbpm":0.5,"duration_sec":1927.2,"size_mb":15.9} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/08/2024.08.10-10.30.30.491--2024.08.10-13.04.17.164.mkv","rate_mbpm":2.6,"duration_sec":9226.7,"size_mb":406.7} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/08/2024.08.11-10.36.46.087--2024.08.11-11.32.06.415.mkv","rate_mbpm":2.9,"duration_sec":3320.3,"size_mb":159.5} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/08/2024.08.11-11.33.11.155--2024.08.11-11.59.56.867.mkv","rate_mbpm":4.3,"duration_sec":1605.7,"size_mb":115.1} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/08/2024.08.11-15.13.20.429--2024.08.11-18.08.06.427.mkv","rate_mbpm":2.1,"duration_sec":10486.0,"size_mb":360.7} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/08/2024.08.11-18.35.40.692--2024.08.13-12.15.44.371.mkv","rate_mbpm":1.3,"duration_sec":150003.7,"size_mb":3282.1} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/08/2024.08.13-12.15.50.096--2024.08.13-13.35.26.971.mkv","rate_mbpm":2.9,"duration_sec":4776.9,"size_mb":231.3} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/08/2024.08.13-18.39.32.530--2024.08.13-18.39.38.877.mkv","rate_mbpm":1.7,"duration_sec":6.3,"size_mb":0.2} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/08/2024.08.13-18.39.44.852--2024.08.13-22.05.47.521.mkv","rate_mbpm":0.0,"duration_sec":12362.7,"size_mb":0.0} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/08/2024.08.14-08.41.49.244--2024.08.14-08.57.18.091.mkv","rate_mbpm":3.4,"duration_sec":928.8,"size_mb":53.3} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/08/2024.08.14-08.57.44.191--2024.08.14-09.44.06.956.mkv","rate_mbpm":3.0,"duration_sec":2782.8,"size_mb":141.1} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/08/2024.08.14-10.26.36.695--2024.08.14-10.28.29.020.mkv","rate_mbpm":2.0,"duration_sec":112.3,"size_mb":3.7} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/08/2024.08.14-10.28.34.680--2024.08.14-11.01.35.547.mkv","rate_mbpm":2.7,"duration_sec":1980.9,"size_mb":90.2} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/08/2024.08.14-14.03.29.366--2024.08.14-14.07.27.991.mkv","rate_mbpm":2.7,"duration_sec":238.6,"size_mb":10.6} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/08/2024.08.14-14.07.33.434--2024.08.14-17.00.06.804.mkv","rate_mbpm":2.4,"duration_sec":10353.4,"size_mb":420.7} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/08/2024.08.16-12.25.53.815--2024.08.16-12.26.00.836.mkv","rate_mbpm":4.6,"duration_sec":7.0,"size_mb":0.5} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/08/2024.08.16-12.26.06.183--2024.08.16-12.30.30.339.mkv","rate_mbpm":3.2,"duration_sec":264.2,"size_mb":14.1} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/08/2024.08.16-12.30.36.122--2024.08.16-12.30.43.268.mkv","rate_mbpm":6.8,"duration_sec":7.1,"size_mb":0.8} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/08/2024.08.16-12.30.48.473--2024.08.16-12.57.46.825.mkv","rate_mbpm":5.1,"duration_sec":1618.4,"size_mb":137.1} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/08/2024.08.16-12.57.52.121--2024.08.16-13.07.14.137.mkv","rate_mbpm":1.2,"duration_sec":562.0,"size_mb":11.1} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/08/2024.08.16-13.07.16.057--2024.08.16-14.06.22.237.mkv","rate_mbpm":1.3,"duration_sec":3546.2,"size_mb":77.2} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/08/2024.08.16-14.09.52.399--2024.08.16-14.09.59.329.mkv","rate_mbpm":6.1,"duration_sec":6.9,"size_mb":0.7} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/08/2024.08.16-14.10.04.739--2024.08.16-14.41.19.742.mkv","rate_mbpm":2.0,"duration_sec":1875.0,"size_mb":63.6} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/08/2024.08.30-11.22.12.442--2024.08.30-11.31.31.036.mkv","rate_mbpm":2.5,"duration_sec":558.6,"size_mb":22.9} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/08/2024.08.30-11.31.43.836--2024.08.30-11.31.50.538.mkv","rate_mbpm":2.1,"duration_sec":6.7,"size_mb":0.2} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/08/2024.08.30-11.31.56.000--2024.08.30-11.48.03.377.mkv","rate_mbpm":1.3,"duration_sec":967.4,"size_mb":20.6} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/08/2024.08.30-15.59.19.655--2024.08.30-18.11.36.579.mkv","rate_mbpm":4.6,"duration_sec":7936.9,"size_mb":613.9} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/08/2024.08.31-22.53.34.767--2024.08.31-22.53.41.857.mkv","rate_mbpm":8.6,"duration_sec":7.1,"size_mb":1.0} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/08/2024.08.31-22.53.47.301--2024.08.31-22.54.07.846.mkv","rate_mbpm":5.5,"duration_sec":20.5,"size_mb":1.9} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/08/2024.08.31-22.55.05.278--2024.08.31-22.55.12.304.mkv","rate_mbpm":9.2,"duration_sec":7.0,"size_mb":1.1} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/08/2024.08.31-22.55.17.805--2024.08.31-23.07.53.985.mkv","rate_mbpm":6.5,"duration_sec":756.2,"size_mb":82.2} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/08/2024.08.31-23.09.27.899--2024.08.31-23.09.34.526.mkv","rate_mbpm":2.4,"duration_sec":6.6,"size_mb":0.3} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/08/2024.08.31-23.15.49.960--2024.08.31-23.34.24.261.mkv","rate_mbpm":7.5,"duration_sec":1114.3,"size_mb":139.8} diff --git a/Capture/research/ffmpeg_enc/video_size_2024_09.jsonl b/Capture/research/ffmpeg_enc/video_size_2024_09.jsonl new file mode 100644 index 0000000..cd59f2a --- /dev/null +++ b/Capture/research/ffmpeg_enc/video_size_2024_09.jsonl @@ -0,0 +1,172 @@ +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.01-16.44.40.403--2024.09.01-19.17.06.396.mkv","rate_mbpm":2.5,"duration_sec":9146.0,"size_mb":378.5} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.01-19.53.00.133--2024.09.01-20.02.18.704.mkv","rate_mbpm":4.9,"duration_sec":558.6,"size_mb":45.3} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.01-20.02.24.441--2024.09.03-20.54.52.012.mkv","rate_mbpm":1.3,"duration_sec":175947.6,"size_mb":3913.0} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.03-20.54.57.746--2024.09.03-20.55.07.833.mkv","rate_mbpm":2.0,"duration_sec":10.1,"size_mb":0.3} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.04-07.55.25.546--2024.09.04-07.55.32.339.mkv","rate_mbpm":3.0,"duration_sec":6.8,"size_mb":0.3} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.04-07.55.38.099--2024.09.04-07.55.44.708.mkv","rate_mbpm":1.8,"duration_sec":6.6,"size_mb":0.2} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.04-07.56.03.906--2024.09.04-07.56.10.528.mkv","rate_mbpm":1.7,"duration_sec":6.6,"size_mb":0.2} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.04-07.59.54.307--2024.09.04-09.20.42.677.mkv","rate_mbpm":2.0,"duration_sec":4848.4,"size_mb":161.9} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.05-07.57.12.414--2024.09.05-07.57.19.442.mkv","rate_mbpm":3.4,"duration_sec":7.0,"size_mb":0.4} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.05-07.57.24.957--2024.09.05-07.58.30.665.mkv","rate_mbpm":2.7,"duration_sec":65.7,"size_mb":3.0} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.05-11.58.33.754--2024.09.05-11.58.40.801.mkv","rate_mbpm":3.0,"duration_sec":7.0,"size_mb":0.3} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.05-11.58.49.359--2024.09.05-16.17.20.340.mkv","rate_mbpm":2.2,"duration_sec":15511.0,"size_mb":570.8} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.05-16.17.26.112--2024.09.06-08.55.03.649.mkv","rate_mbpm":1.4,"duration_sec":59857.5,"size_mb":1360.9} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.06-08.56.47.148--2024.09.06-08.56.53.735.mkv","rate_mbpm":1.6,"duration_sec":6.6,"size_mb":0.2} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.06-09.11.10.864--2024.09.06-10.55.35.713.mkv","rate_mbpm":2.1,"duration_sec":6264.8,"size_mb":220.5} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.06-14.06.08.492--2024.09.06-15.02.38.048.mkv","rate_mbpm":7.2,"duration_sec":3389.6,"size_mb":407.9} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.08-13.30.06.093--2024.09.08-13.30.13.264.mkv","rate_mbpm":14.3,"duration_sec":7.2,"size_mb":1.7} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.08-13.30.18.659--2024.09.08-13.30.35.998.mkv","rate_mbpm":8.4,"duration_sec":17.3,"size_mb":2.4} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.08-13.30.44.713--2024.09.08-13.31.43.698.mkv","rate_mbpm":9.2,"duration_sec":59.0,"size_mb":9.0} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.08-13.53.03.034--2024.09.08-13.53.10.007.mkv","rate_mbpm":11.7,"duration_sec":7.0,"size_mb":1.4} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.08-13.53.15.565--2024.09.08-14.37.06.972.mkv","rate_mbpm":4.4,"duration_sec":2631.4,"size_mb":191.1} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.08-14.37.45.738--2024.09.08-14.37.52.614.mkv","rate_mbpm":12.7,"duration_sec":6.9,"size_mb":1.5} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.08-14.37.58.282--2024.09.08-15.14.31.215.mkv","rate_mbpm":5.2,"duration_sec":2192.9,"size_mb":190.7} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.08-17.24.41.812--2024.09.08-18.03.16.579.mkv","rate_mbpm":2.7,"duration_sec":2314.8,"size_mb":103.1} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.09-13.58.22.539--2024.09.09-13.58.29.330.mkv","rate_mbpm":3.0,"duration_sec":6.8,"size_mb":0.3} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.09-14.00.00.664--2024.09.09-14.00.07.717.mkv","rate_mbpm":3.2,"duration_sec":7.1,"size_mb":0.4} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.09-14.00.13.187--2024.09.09-16.13.54.774.mkv","rate_mbpm":2.2,"duration_sec":8021.6,"size_mb":298.6} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.10-10.14.45.335--2024.09.10-10.15.06.607.mkv","rate_mbpm":2.9,"duration_sec":21.3,"size_mb":1.0} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.10-10.15.23.587--2024.09.10-18.08.58.661.mkv","rate_mbpm":2.0,"duration_sec":28415.1,"size_mb":969.6} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.11-12.50.50.281--2024.09.11-14.20.51.025.mkv","rate_mbpm":6.7,"duration_sec":5400.7,"size_mb":600.5} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.11-15.17.38.731--2024.09.11-15.17.58.187.mkv","rate_mbpm":10.3,"duration_sec":19.5,"size_mb":3.3} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.12-07.55.56.202--2024.09.12-07.56.07.232.mkv","rate_mbpm":3.3,"duration_sec":11.0,"size_mb":0.6} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.12-08.00.41.899--2024.09.12-08.06.01.463.mkv","rate_mbpm":3.2,"duration_sec":319.6,"size_mb":16.9} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.12-08.07.43.850--2024.09.12-08.07.50.820.mkv","rate_mbpm":3.0,"duration_sec":7.0,"size_mb":0.4} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.12-08.07.56.400--2024.09.12-08.08.02.986.mkv","rate_mbpm":3.2,"duration_sec":6.6,"size_mb":0.4} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.12-08.08.08.937--2024.09.12-08.08.58.464.mkv","rate_mbpm":2.4,"duration_sec":49.5,"size_mb":2.0} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.12-08.09.03.930--2024.09.12-11.59.08.549.mkv","rate_mbpm":2.2,"duration_sec":13804.6,"size_mb":502.0} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.12-11.59.14.447--2024.09.12-13.47.32.370.mkv","rate_mbpm":1.4,"duration_sec":6497.9,"size_mb":147.7} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.12-13.47.38.186--2024.09.12-15.35.38.839.mkv","rate_mbpm":2.1,"duration_sec":6480.7,"size_mb":230.9} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.13-15.20.30.625--2024.09.13-15.20.37.440.mkv","rate_mbpm":12.8,"duration_sec":6.8,"size_mb":1.4} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.13-15.20.43.174--2024.09.13-15.31.21.313.mkv","rate_mbpm":7.9,"duration_sec":638.1,"size_mb":84.5} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.13-18.37.45.831--2024.09.13-18.37.52.431.mkv","rate_mbpm":2.6,"duration_sec":6.6,"size_mb":0.3} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.13-18.38.31.970--2024.09.13-19.31.24.819.mkv","rate_mbpm":7.2,"duration_sec":3172.8,"size_mb":378.9} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.13-19.39.57.051--2024.09.13-19.40.25.980.mkv","rate_mbpm":6.7,"duration_sec":28.9,"size_mb":3.2} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.15-12.47.48.758--2024.09.15-13.47.25.821.mkv","rate_mbpm":1.6,"duration_sec":3577.1,"size_mb":97.6} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.16-09.48.23.289--2024.09.16-09.48.30.139.mkv","rate_mbpm":3.4,"duration_sec":6.8,"size_mb":0.4} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.16-09.48.35.834--2024.09.16-10.27.23.448.mkv","rate_mbpm":2.5,"duration_sec":2327.6,"size_mb":95.7} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.16-10.27.50.313--2024.09.16-10.27.57.347.mkv","rate_mbpm":3.4,"duration_sec":7.0,"size_mb":0.4} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.16-10.28.02.854--2024.09.16-12.06.53.227.mkv","rate_mbpm":2.2,"duration_sec":5930.4,"size_mb":217.2} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.16-12.46.58.714--2024.09.16-14.30.57.087.mkv","rate_mbpm":5.6,"duration_sec":6238.4,"size_mb":586.9} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.16-15.57.14.818--2024.09.16-15.57.41.455.mkv","rate_mbpm":2.7,"duration_sec":26.6,"size_mb":1.2} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.16-15.58.12.489--2024.09.16-15.58.19.492.mkv","rate_mbpm":2.3,"duration_sec":7.0,"size_mb":0.3} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.16-15.58.25.031--2024.09.16-15.58.40.410.mkv","rate_mbpm":2.6,"duration_sec":15.4,"size_mb":0.7} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.16-16.01.50.235--2024.09.16-16.31.54.292.mkv","rate_mbpm":2.7,"duration_sec":1804.1,"size_mb":80.0} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.16-16.32.22.908--2024.09.16-18.24.49.623.mkv","rate_mbpm":2.2,"duration_sec":6746.7,"size_mb":246.9} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.17-08.25.15.842--2024.09.17-10.30.17.897.mkv","rate_mbpm":2.2,"duration_sec":7502.1,"size_mb":280.4} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.18-09.33.10.441--2024.09.18-09.45.51.842.mkv","rate_mbpm":16.0,"duration_sec":761.4,"size_mb":203.7} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.18-09.46.26.539--2024.09.18-09.46.32.932.mkv","rate_mbpm":19.5,"duration_sec":6.4,"size_mb":2.1} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.18-09.46.39.096--2024.09.18-10.06.22.175.mkv","rate_mbpm":15.9,"duration_sec":1183.1,"size_mb":314.1} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.18-10.06.29.356--2024.09.18-10.15.34.576.mkv","rate_mbpm":12.8,"duration_sec":545.2,"size_mb":116.7} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.18-10.15.41.746--2024.09.18-10.18.14.279.mkv","rate_mbpm":14.4,"duration_sec":152.5,"size_mb":36.6} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.18-15.31.08.062--2024.09.18-15.31.14.430.mkv","rate_mbpm":7.4,"duration_sec":6.4,"size_mb":0.8} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.18-15.32.16.624--2024.09.18-15.32.22.998.mkv","rate_mbpm":19.4,"duration_sec":6.4,"size_mb":2.1} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.18-15.32.29.152--2024.09.18-15.32.45.915.mkv","rate_mbpm":16.1,"duration_sec":16.8,"size_mb":4.5} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.18-15.33.51.157--2024.09.18-15.53.12.366.mkv","rate_mbpm":15.4,"duration_sec":1161.2,"size_mb":299.0} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.18-15.53.25.659--2024.09.18-15.53.32.039.mkv","rate_mbpm":19.4,"duration_sec":6.4,"size_mb":2.1} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.18-15.53.38.191--2024.09.18-17.15.08.099.mkv","rate_mbpm":16.0,"duration_sec":4889.9,"size_mb":1305.0} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.18-17.53.40.853--2024.09.18-17.53.47.235.mkv","rate_mbpm":9.6,"duration_sec":6.4,"size_mb":1.0} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.18-17.53.53.398--2024.09.18-17.54.05.956.mkv","rate_mbpm":7.7,"duration_sec":12.6,"size_mb":1.6} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.18-17.54.12.127--2024.09.18-18.35.40.866.mkv","rate_mbpm":1.6,"duration_sec":2488.7,"size_mb":65.8} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.18-18.35.47.062--2024.09.18-20.27.41.663.mkv","rate_mbpm":14.6,"duration_sec":6714.6,"size_mb":1633.8} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.19-13.39.44.968--2024.09.19-13.39.51.330.mkv","rate_mbpm":19.5,"duration_sec":6.4,"size_mb":2.1} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.19-13.39.57.498--2024.09.19-15.02.02.891.mkv","rate_mbpm":15.7,"duration_sec":4925.4,"size_mb":1287.8} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.19-15.05.15.416--2024.09.19-15.07.03.154.mkv","rate_mbpm":14.8,"duration_sec":107.7,"size_mb":26.6} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.20-07.49.17.154--2024.09.20-12.08.15.436.mkv","rate_mbpm":10.5,"duration_sec":15538.3,"size_mb":2729.9} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.20-13.05.44.239--2024.09.20-13.05.50.607.mkv","rate_mbpm":19.5,"duration_sec":6.4,"size_mb":2.1} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.20-13.05.56.774--2024.09.20-14.21.49.311.mkv","rate_mbpm":15.2,"duration_sec":4552.5,"size_mb":1155.3} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.20-16.46.55.711--2024.09.20-16.47.02.099.mkv","rate_mbpm":6.7,"duration_sec":6.4,"size_mb":0.7} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.20-16.47.08.244--2024.09.20-18.55.03.119.mkv","rate_mbpm":10.7,"duration_sec":7674.9,"size_mb":1366.3} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.21-14.00.43.923--2024.09.21-14.00.50.322.mkv","rate_mbpm":6.0,"duration_sec":6.4,"size_mb":0.6} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.21-14.00.56.467--2024.09.21-15.55.20.377.mkv","rate_mbpm":9.1,"duration_sec":6863.9,"size_mb":1035.6} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.21-15.55.26.510--2024.09.21-15.57.42.672.mkv","rate_mbpm":1.9,"duration_sec":136.2,"size_mb":4.3} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.21-15.57.48.816--2024.09.21-15.58.05.489.mkv","rate_mbpm":14.9,"duration_sec":16.7,"size_mb":4.1} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.21-15.58.11.652--2024.09.21-16.25.46.109.mkv","rate_mbpm":13.5,"duration_sec":1654.5,"size_mb":371.8} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.22-12.41.29.774--2024.09.22-12.41.47.519.mkv","rate_mbpm":14.1,"duration_sec":17.7,"size_mb":4.2} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.22-12.42.09.987--2024.09.22-12.42.16.388.mkv","rate_mbpm":18.5,"duration_sec":6.4,"size_mb":2.0} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.22-12.42.22.531--2024.09.22-14.39.17.404.mkv","rate_mbpm":15.4,"duration_sec":7014.9,"size_mb":1795.8} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.22-14.58.43.143--2024.09.22-15.11.01.605.mkv","rate_mbpm":16.0,"duration_sec":738.5,"size_mb":197.0} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.22-15.11.07.764--2024.09.22-15.19.29.744.mkv","rate_mbpm":16.0,"duration_sec":502.0,"size_mb":133.9} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.22-15.19.35.889--2024.09.22-16.36.21.223.mkv","rate_mbpm":10.2,"duration_sec":4605.3,"size_mb":786.5} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.23-13.41.36.221--2024.09.23-13.41.42.599.mkv","rate_mbpm":4.3,"duration_sec":6.4,"size_mb":0.5} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.23-13.41.48.760--2024.09.23-15.38.36.099.mkv","rate_mbpm":14.0,"duration_sec":7007.3,"size_mb":1635.2} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.23-15.42.24.520--2024.09.23-15.42.30.900.mkv","rate_mbpm":6.2,"duration_sec":6.4,"size_mb":0.7} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.23-15.42.46.224--2024.09.23-15.45.08.186.mkv","rate_mbpm":15.5,"duration_sec":142.0,"size_mb":36.8} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.23-15.45.14.362--2024.09.23-15.56.59.208.mkv","rate_mbpm":1.8,"duration_sec":704.8,"size_mb":20.7} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.23-15.57.05.368--2024.09.23-17.23.23.457.mkv","rate_mbpm":14.2,"duration_sec":5178.1,"size_mb":1221.7} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.23-17.34.21.824--2024.09.23-20.31.00.051.mkv","rate_mbpm":13.1,"duration_sec":10598.2,"size_mb":2315.6} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.24-08.27.30.003--2024.09.24-10.32.51.733.mkv","rate_mbpm":9.5,"duration_sec":7521.7,"size_mb":1194.9} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.24-10.39.09.772--2024.09.24-10.39.16.164.mkv","rate_mbpm":18.6,"duration_sec":6.4,"size_mb":2.0} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.24-10.39.22.307--2024.09.24-10.39.39.016.mkv","rate_mbpm":16.6,"duration_sec":16.7,"size_mb":4.6} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.24-10.42.41.380--2024.09.24-12.06.51.304.mkv","rate_mbpm":12.0,"duration_sec":5049.9,"size_mb":1006.5} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.24-13.01.01.835--2024.09.24-15.02.33.481.mkv","rate_mbpm":15.6,"duration_sec":7291.6,"size_mb":1897.4} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.24-15.07.26.039--2024.09.24-16.52.17.064.mkv","rate_mbpm":8.2,"duration_sec":6291.0,"size_mb":858.0} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.25-10.01.09.663--2024.09.25-12.19.42.453.mkv","rate_mbpm":11.7,"duration_sec":8312.8,"size_mb":1621.1} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.25-14.55.35.934--2024.09.25-14.55.42.325.mkv","rate_mbpm":19.4,"duration_sec":6.4,"size_mb":2.1} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.25-14.55.48.479--2024.09.25-14.56.06.283.mkv","rate_mbpm":16.4,"duration_sec":17.8,"size_mb":4.9} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.25-15.04.34.032--2024.09.25-15.04.40.427.mkv","rate_mbpm":17.2,"duration_sec":6.4,"size_mb":1.8} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.25-15.04.46.570--2024.09.25-15.19.09.587.mkv","rate_mbpm":16.0,"duration_sec":863.0,"size_mb":230.8} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.25-15.19.15.724--2024.09.25-16.47.59.269.mkv","rate_mbpm":15.4,"duration_sec":5323.5,"size_mb":1362.9} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.26-12.00.42.118--2024.09.26-12.00.48.501.mkv","rate_mbpm":13.1,"duration_sec":6.4,"size_mb":1.4} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.26-12.00.54.653--2024.09.26-14.04.49.707.mkv","rate_mbpm":13.6,"duration_sec":7435.1,"size_mb":1681.9} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.26-14.04.55.842--2024.09.26-17.16.29.387.mkv","rate_mbpm":1.7,"duration_sec":11493.5,"size_mb":326.6} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.26-17.16.35.509--2024.09.26-19.52.08.069.mkv","rate_mbpm":10.1,"duration_sec":9332.6,"size_mb":1576.7} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.27-12.31.28.287--2024.09.27-12.33.30.633.mkv","rate_mbpm":9.4,"duration_sec":122.3,"size_mb":19.1} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.27-12.33.39.854--2024.09.27-12.33.46.253.mkv","rate_mbpm":18.1,"duration_sec":6.4,"size_mb":1.9} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.27-12.33.52.416--2024.09.27-14.27.24.182.mkv","rate_mbpm":10.8,"duration_sec":6811.8,"size_mb":1228.5} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.27-14.33.48.431--2024.09.27-14.33.54.825.mkv","rate_mbpm":18.1,"duration_sec":6.4,"size_mb":1.9} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.27-14.34.00.979--2024.09.27-15.00.37.565.mkv","rate_mbpm":16.1,"duration_sec":1596.6,"size_mb":427.1} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.27-15.00.43.718--2024.09.27-15.01.18.050.mkv","rate_mbpm":16.7,"duration_sec":34.3,"size_mb":9.5} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.27-15.01.24.193--2024.09.27-15.02.10.989.mkv","rate_mbpm":16.5,"duration_sec":46.8,"size_mb":12.9} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.27-15.02.17.151--2024.09.27-15.07.57.606.mkv","rate_mbpm":16.1,"duration_sec":340.5,"size_mb":91.2} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.27-15.08.03.761--2024.09.27-15.09.26.713.mkv","rate_mbpm":16.3,"duration_sec":83.0,"size_mb":22.5} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.27-15.09.32.873--2024.09.27-15.09.56.849.mkv","rate_mbpm":16.9,"duration_sec":24.0,"size_mb":6.8} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.27-15.10.03.002--2024.09.27-15.11.18.730.mkv","rate_mbpm":16.3,"duration_sec":75.7,"size_mb":20.6} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.27-15.11.24.884--2024.09.27-15.11.46.786.mkv","rate_mbpm":17.1,"duration_sec":21.9,"size_mb":6.2} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.27-15.11.52.940--2024.09.27-15.12.13.805.mkv","rate_mbpm":17.1,"duration_sec":20.9,"size_mb":5.9} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.27-15.12.19.950--2024.09.27-15.12.26.342.mkv","rate_mbpm":19.5,"duration_sec":6.4,"size_mb":2.1} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.27-15.12.32.508--2024.09.27-15.12.39.951.mkv","rate_mbpm":19.1,"duration_sec":7.4,"size_mb":2.4} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.27-15.12.46.083--2024.09.27-15.13.58.686.mkv","rate_mbpm":16.3,"duration_sec":72.6,"size_mb":19.7} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.27-15.14.04.832--2024.09.27-15.14.21.590.mkv","rate_mbpm":17.3,"duration_sec":16.8,"size_mb":4.8} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.27-15.14.27.738--2024.09.27-15.16.52.741.mkv","rate_mbpm":16.2,"duration_sec":145.0,"size_mb":39.1} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.27-15.16.58.908--2024.09.27-15.17.05.290.mkv","rate_mbpm":19.5,"duration_sec":6.4,"size_mb":2.1} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.27-15.17.11.451--2024.09.27-15.17.17.829.mkv","rate_mbpm":19.5,"duration_sec":6.4,"size_mb":2.1} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.27-15.17.23.993--2024.09.27-15.17.44.866.mkv","rate_mbpm":17.1,"duration_sec":20.9,"size_mb":5.9} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.27-15.17.51.007--2024.09.27-15.17.57.397.mkv","rate_mbpm":19.5,"duration_sec":6.4,"size_mb":2.1} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.27-15.18.03.550--2024.09.27-15.18.09.925.mkv","rate_mbpm":19.5,"duration_sec":6.4,"size_mb":2.1} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.27-15.18.16.093--2024.09.27-15.18.22.477.mkv","rate_mbpm":19.5,"duration_sec":6.4,"size_mb":2.1} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.27-15.18.28.645--2024.09.27-15.18.46.429.mkv","rate_mbpm":17.2,"duration_sec":17.8,"size_mb":5.1} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.27-15.18.52.588--2024.09.27-15.19.23.846.mkv","rate_mbpm":16.7,"duration_sec":31.3,"size_mb":8.7} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.27-15.19.29.994--2024.09.27-15.19.57.037.mkv","rate_mbpm":16.9,"duration_sec":27.0,"size_mb":7.6} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.27-15.20.03.192--2024.09.27-15.20.15.789.mkv","rate_mbpm":17.8,"duration_sec":12.6,"size_mb":3.7} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.27-15.20.21.940--2024.09.27-15.20.31.400.mkv","rate_mbpm":18.3,"duration_sec":9.5,"size_mb":2.9} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.27-15.20.37.576--2024.09.27-15.20.49.132.mkv","rate_mbpm":17.9,"duration_sec":11.6,"size_mb":3.5} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.27-15.20.55.299--2024.09.27-15.21.08.918.mkv","rate_mbpm":17.7,"duration_sec":13.6,"size_mb":4.0} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.27-15.21.15.087--2024.09.27-15.22.49.483.mkv","rate_mbpm":16.3,"duration_sec":94.4,"size_mb":25.6} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.27-15.22.55.629--2024.09.27-15.25.37.106.mkv","rate_mbpm":16.2,"duration_sec":161.5,"size_mb":43.5} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.27-15.25.43.268--2024.09.27-15.27.04.262.mkv","rate_mbpm":16.3,"duration_sec":81.0,"size_mb":22.0} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.27-15.27.10.403--2024.09.27-15.27.26.119.mkv","rate_mbpm":17.4,"duration_sec":15.7,"size_mb":4.6} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.27-15.27.32.276--2024.09.27-15.28.50.074.mkv","rate_mbpm":16.3,"duration_sec":77.8,"size_mb":21.1} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.27-15.28.56.212--2024.09.27-15.29.19.177.mkv","rate_mbpm":17.0,"duration_sec":23.0,"size_mb":6.5} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.27-15.29.25.332--2024.09.27-15.31.23.520.mkv","rate_mbpm":16.2,"duration_sec":118.2,"size_mb":31.9} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.27-15.31.29.675--2024.09.27-15.31.36.061.mkv","rate_mbpm":19.5,"duration_sec":6.4,"size_mb":2.1} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.27-15.31.42.222--2024.09.27-15.32.03.076.mkv","rate_mbpm":17.1,"duration_sec":20.9,"size_mb":6.0} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.27-15.32.09.238--2024.09.27-15.32.15.636.mkv","rate_mbpm":19.5,"duration_sec":6.4,"size_mb":2.1} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.27-15.32.21.790--2024.09.27-15.32.38.530.mkv","rate_mbpm":17.4,"duration_sec":16.7,"size_mb":4.8} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.27-15.32.44.687--2024.09.27-15.36.47.054.mkv","rate_mbpm":16.1,"duration_sec":242.4,"size_mb":65.0} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.27-15.36.53.207--2024.09.27-15.36.59.593.mkv","rate_mbpm":19.5,"duration_sec":6.4,"size_mb":2.1} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.27-15.37.05.754--2024.09.27-15.37.18.369.mkv","rate_mbpm":17.8,"duration_sec":12.6,"size_mb":3.7} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.27-15.37.24.516--2024.09.27-15.38.45.332.mkv","rate_mbpm":16.3,"duration_sec":80.8,"size_mb":21.9} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.27-15.38.51.492--2024.09.27-15.40.45.449.mkv","rate_mbpm":16.2,"duration_sec":114.0,"size_mb":30.8} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.27-15.40.51.602--2024.09.27-15.47.14.390.mkv","rate_mbpm":16.1,"duration_sec":382.8,"size_mb":102.6} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.27-15.47.20.554--2024.09.27-15.58.30.637.mkv","rate_mbpm":16.0,"duration_sec":670.1,"size_mb":179.2} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.27-15.59.36.942--2024.09.27-15.59.43.333.mkv","rate_mbpm":14.4,"duration_sec":6.4,"size_mb":1.5} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.27-15.59.49.493--2024.09.27-16.06.19.822.mkv","rate_mbpm":11.2,"duration_sec":390.3,"size_mb":73.0} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.30-10.35.10.597--2024.09.30-10.35.16.972.mkv","rate_mbpm":7.6,"duration_sec":6.4,"size_mb":0.8} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.30-10.35.23.119--2024.09.30-12.24.13.800.mkv","rate_mbpm":10.8,"duration_sec":6530.7,"size_mb":1170.8} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.30-12.27.48.953--2024.09.30-12.27.55.349.mkv","rate_mbpm":19.2,"duration_sec":6.4,"size_mb":2.0} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.30-12.28.01.493--2024.09.30-12.44.35.998.mkv","rate_mbpm":16.0,"duration_sec":994.5,"size_mb":265.9} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.30-12.44.55.404--2024.09.30-12.45.01.792.mkv","rate_mbpm":16.3,"duration_sec":6.4,"size_mb":1.7} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.30-12.45.07.930--2024.09.30-14.00.25.961.mkv","rate_mbpm":15.4,"duration_sec":4518.0,"size_mb":1159.5} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.30-16.56.43.875--2024.09.30-16.56.50.261.mkv","rate_mbpm":5.8,"duration_sec":6.4,"size_mb":0.6} +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/09/2024.09.30-16.56.56.427--2024.09.30-18.48.35.743.mkv","rate_mbpm":13.0,"duration_sec":6699.3,"size_mb":1452.4} diff --git a/Capture/research/ffmpeg_enc/video_size_2024_10.jsonl b/Capture/research/ffmpeg_enc/video_size_2024_10.jsonl new file mode 100644 index 0000000..699c81d --- /dev/null +++ b/Capture/research/ffmpeg_enc/video_size_2024_10.jsonl @@ -0,0 +1 @@ +{"path":"/data/repronim/reprostim-reproiner/Videos/2024/10/2024.10.01-07.56.48.639--2024.10.01-10.57.51.891.mkv","rate_mbpm":12.9,"duration_sec":10863.3,"size_mb":2342.2} diff --git a/Capture/research/ffmpeg_enc/video_size_results.txt b/Capture/research/ffmpeg_enc/video_size_results.txt new file mode 100644 index 0000000..dcea6c3 --- /dev/null +++ b/Capture/research/ffmpeg_enc/video_size_results.txt @@ -0,0 +1,11 @@ +Notes for analysis on the video sizes recorded by reprostim-videocapture utility with command like below: + +(venv) @typhon:~/reprostim/Parsing$ ./parse_wQR.py --mode=INFO /data/repronim/reprostim-reproiner/Videos/2024/07 + +Before changes recorded mkv video file size was around : 2-7 MB /minute. +After changes with bitrate 2Mb the video file size was around : 15-19 MB /minute. + +So most likely the video size is increased in 4 times+ after applied changes in the second half of Sep 2024. + +Since Oct 2, 2024 we increased the ffmpeg bitrate limits to 8Mb from 2Mb, but at this moment don't have statistics yet +on the video sizes. diff --git a/Capture/version.txt b/Capture/version.txt index 1ac51ca..150d34a 100644 --- a/Capture/version.txt +++ b/Capture/version.txt @@ -1 +1 @@ -1.11.0.267 \ No newline at end of file +1.11.0.303 \ No newline at end of file diff --git a/Capture/videocapture/config.yaml b/Capture/videocapture/config.yaml index 7d10029..e572fa1 100644 --- a/Capture/videocapture/config.yaml +++ b/Capture/videocapture/config.yaml @@ -30,6 +30,18 @@ session_logger_level: "DEBUG" # specify session log line format, from spdlog library session_logger_pattern: "%Y-%m-%d %H:%M:%S.%e [%l] [%t] %v" +# +# Specify con/duct options to execute ffmpeg command +# +conduct_opts: + # to enable con/duct set "enabled" to "true" + enabled: true + # cmd template + #cmd: "echo '${ffmpeg_cmd}'" + cmd: "${duct_bin} -l NONE -p ${prefix} -c none --sample-interval 10 --report-interval 60 ${ffmpeg_cmd}" + # specify con/duct tool path/etc + duct_bin: "duct" + # # Specify ReproNim/repromon options # @@ -90,10 +102,9 @@ ffm_opts: # #v_dev: "/dev/video4" v_dev: "auto" - v_enc: "-c:v libx264 -flush_packets 1" - #v_enc: "-c:v libx264 -preset veryslow -crf 0" + v_enc: "-c:v libx264 -flush_packets 1 -preset ultrafast -crf 18 -tune zerolatency -b:v 8M -maxrate 8M -bufsize 16M -vf setpts=PTS-STARTPTS" pix_fmt: "" #pix_fmt: "-pix_fmt yuv420p" - n_threads: "" - a_enc: "-acodec aac" + n_threads: "-threads 4" + a_enc: "-acodec aac -af asetpts=PTS-STARTPTS" out_fmt: "mkv" diff --git a/Capture/videocapture/src/VideoCapture.cpp b/Capture/videocapture/src/VideoCapture.cpp index 4a72683..05f27fd 100644 --- a/Capture/videocapture/src/VideoCapture.cpp +++ b/Capture/videocapture/src/VideoCapture.cpp @@ -57,6 +57,24 @@ using namespace reprostim; +//////////////////////////////////////////////////////////////////////////// +// Static variables + +// store last activity of ffmpeg recording thread in currentTimeMs time +std::atomic s_ffmpegKeepAliveTs{0}; + +//////////////////////////////////////////////////////////////////////////// +// Macros / constants + +#ifndef _FFMPEG_KEEP_ALIVE +#define _FFMPEG_KEEP_ALIVE() s_ffmpegKeepAliveTs.store(reprostim::currentTimeMs()) +#endif + +// 1 minute time-out for ffmpeg thread to auto-recover +#ifndef _FFMPEG_RECOVERY_TIMEOUT_MS +#define _FFMPEG_RECOVERY_TIMEOUT_MS 60000 +#endif + //////////////////////////////////////////////////////////////////////////// // @@ -86,6 +104,22 @@ bool killProc(const std::string& procName, return pid.length()==0?true:false; } +void renameConductFiles(const std::string &old_prefix, const std::string &new_prefix) { + std::string o1 = old_prefix + "info.json"; + std::string n1 = new_prefix + "info.json"; + std::string o2 = old_prefix + "usage.json"; + std::string n2 = new_prefix + "usage.json"; + + if( std::filesystem::exists(o1) ) { + _INFO("Renaming con/duct info : " << o1 << " -> " << n1); + rename(o1.c_str(), n1.c_str()); + } + if( std::filesystem::exists(o2) ) { + _INFO("Renaming con/duct usage: " << o2 << " -> " << n2); + rename(o2.c_str(), n2.c_str()); + } +} + std::string renameVideoFile( const std::string& outVideoFile, const std::string& outPath, @@ -106,6 +140,7 @@ std::string renameVideoFile( template<> void FfmpegThread ::run() { _SESSION_LOG_BEGIN(getParams().pLogger); + _FFMPEG_KEEP_ALIVE(); bool fRepromonEnabled = getParams().fRepromonEnabled; RepromonQueue* pRepromonQueue = getParams().pRepromonQueue; @@ -113,6 +148,7 @@ void FfmpegThread ::run() { std::thread::id tid= std::this_thread::get_id(); _VERBOSE("FfmpegThread start [" << tid << "]: " << getParams().cmd); + _INFO("ffmpeg_cmd: " << getParams().ffmpeg_cmd); _INFO(getParams().start_ts << ": " << getParams().cmd); //system(cmd); @@ -120,13 +156,18 @@ void FfmpegThread ::run() { try { exec(getParams().cmd, true, !getParams().fTopLogFfmpeg, 48, - [this]() { return isTerminated(); } + [this]() { + _FFMPEG_KEEP_ALIVE(); + return isTerminated(); + } ); } catch(std::exception& e) { _ERROR("FfmpegThread unhandled exception: " << e.what()); + _FFMPEG_KEEP_ALIVE(); } _VERBOSE("FfmpegThread terminating [" << tid << "]: " << getParams().cmd); + _FFMPEG_KEEP_ALIVE(); std::string outVideoFile2 = renameVideoFile(getParams().outVideoFile, getParams().outPath, getParams().start_ts, @@ -138,6 +179,7 @@ void FfmpegThread ::run() { Timestamp ts = CURRENT_TIMESTAMP(); json jm = { {"type", "session_end"}, + {"version", CAPTURE_VERSION_STRING}, {"json_ts", getTimeStr(ts)}, {"json_isotime", getTimeIsoStr(ts)}, {"message", "ffmpeg thread terminated"}, @@ -146,11 +188,14 @@ void FfmpegThread ::run() { }; _METADATA_LOG(jm); _SESSION_LOG_END_CLOSE_RENAME(outVideoFile2 + ".log"); + _FFMPEG_KEEP_ALIVE(); _NOTIFY_REPROMON( REPROMON_INFO, getParams().appName + " session " + getParams().start_ts + " end, saved to " + std::filesystem::path(outVideoFile2).filename().string() ); + renameConductFiles(getParams().duct_prefix, outVideoFile2+".duct_"); + _FFMPEG_KEEP_ALIVE(); } //////////////////////////////////////////////////////////////////////////// @@ -165,12 +210,32 @@ VideoCaptureApp::~VideoCaptureApp() { m_ffmpegExec.shutdown(); } -void VideoCaptureApp::onCaptureStart() { +void VideoCaptureApp::onCaptureIdle() { + if ( recording==1 ) { + FfmpegThread *pt = m_ffmpegExec.getCurrentThread(); + if ( pt!=nullptr && !pt->isRunning() ) { + if (!isSysBreakExec() ) { + long long ts = s_ffmpegKeepAliveTs.load() + _FFMPEG_RECOVERY_TIMEOUT_MS; + if ( reprostim::currentTimeMs() > ts ) { + _INFO("Restart Recording: Ffmpeg thread terminated, restarting capture"); + onCaptureStartInternal(true); + } else { + _INFO("Skip Restart Recording, waiting for recovery timeout"); + } + } else { + _INFO("Skip Restart Recording, system break/shutdown activity detected"); + } + } + } +} + +void VideoCaptureApp::onCaptureStartInternal(bool fRecovery) { startRecording(vssCur.cx, - vssCur.cy, - frameRate, - targetVideoDevPath, - targetAudioInDevPath); + vssCur.cy, + frameRate, + targetVideoDevPath, + targetAudioInDevPath, + fRecovery); recording = 1; _INFO(start_ts << ":\tStarted Recording: "); _INFO("Apct Rat: " << vssCur.cx << "x" << vssCur.cy); @@ -178,6 +243,10 @@ void VideoCaptureApp::onCaptureStart() { SLEEP_SEC(5); } +void VideoCaptureApp::onCaptureStart() { + onCaptureStartInternal(false); +} + void VideoCaptureApp::onCaptureStop(const std::string& message) { //_INFO("onCaptureStop"); if ( recording > 0 ) { @@ -187,6 +256,7 @@ void VideoCaptureApp::onCaptureStop(const std::string& message) { Timestamp ts = CURRENT_TIMESTAMP(); json jm = { {"type", "capture_stop"}, + {"version", CAPTURE_VERSION_STRING}, {"json_ts", getTimeStr(ts)}, {"json_isotime", getTimeIsoStr(ts)}, {"message", message}, @@ -313,7 +383,7 @@ int VideoCaptureApp::parseOpts(AppOpts& opts, int argc, char* argv[]) { } void VideoCaptureApp::startRecording(int cx, int cy, const std::string& frameRate, - const std::string& v_dev, const std::string& a_dev) { + const std::string& v_dev, const std::string& a_dev, bool fRecovery) { tsStart = CURRENT_TIMESTAMP(); start_ts = getTimeStr(tsStart); outPath = createOutPath(); @@ -350,6 +420,7 @@ void VideoCaptureApp::startRecording(int cx, int cy, const std::string& frameRat Timestamp ts = CURRENT_TIMESTAMP(); json jm = { {"type", "session_begin"}, + {"version", CAPTURE_VERSION_STRING}, {"json_ts", getTimeStr(ts)}, {"json_isotime", getTimeIsoStr(ts)}, {"version", CAPTURE_VERSION_STRING}, @@ -361,7 +432,8 @@ void VideoCaptureApp::startRecording(int cx, int cy, const std::string& frameRat {"cap_isotime_start", getTimeIsoStr(tsStart)}, {"cx", cx}, {"cy", cy}, - {"frameRate", frameRate} + {"frameRate", frameRate}, + {"autoRecovery", fRecovery} }; _METADATA_LOG(jm); _NOTIFY_REPROMON( @@ -377,9 +449,24 @@ void VideoCaptureApp::startRecording(int cx, int cy, const std::string& frameRat {"frameRate", frameRate} } ); + + std::string cmd = ffmpg; + const ConductOpts& conduct_opts = cfg.conduct_opts; + std::string duct_prefix = outVideoFile + ".duct_"; + if (conduct_opts.enabled) { + _VERBOSE("Expand con/duct macros..."); + cmd = expandMacros(conduct_opts.cmd, { + {"duct_bin", conduct_opts.duct_bin}, + {"start_ts", start_ts}, + {"prefix", duct_prefix}, + {"ffmpeg_cmd", ffmpg} + }); + _INFO("Con/duct command: " << cmd); + } _VERBOSE("Created session logger: session_logger_" << start_ts); FfmpegThread* pt = FfmpegThread::newInstance(FfmpegParams{ appName, + cmd, ffmpg, opts.out_fmt, outPath, @@ -389,7 +476,8 @@ void VideoCaptureApp::startRecording(int cx, int cy, const std::string& frameRat pLogger, fRepromonEnabled, pRepromonQueue.get(), // NOTE: unsafe ownership - m_fTopLogFfmpeg + m_fTopLogFfmpeg, + duct_prefix }); m_ffmpegExec.schedule(pt); diff --git a/Capture/videocapture/src/VideoCapture.h b/Capture/videocapture/src/VideoCapture.h index 9d58105..f9e4f15 100644 --- a/Capture/videocapture/src/VideoCapture.h +++ b/Capture/videocapture/src/VideoCapture.h @@ -13,6 +13,7 @@ using namespace reprostim; struct FfmpegParams { const std::string appName; const std::string cmd; + const std::string ffmpeg_cmd; const std::string outExt; const std::string outPath; const std::string outVideoFile; @@ -22,6 +23,7 @@ struct FfmpegParams { const bool fRepromonEnabled; RepromonQueue* pRepromonQueue; const bool fTopLogFfmpeg; + const std::string duct_prefix; }; using FfmpegThread = WorkerThread; @@ -31,8 +33,11 @@ class VideoCaptureApp: public CaptureApp { SingleThreadExecutor m_ffmpegExec; bool m_fTopLogFfmpeg; + void onCaptureStartInternal(bool fRecovery = false); + void startRecording(int cx, int cy, const std::string& frameRate, - const std::string& v_dev, const std::string& a_dev); + const std::string& v_dev, const std::string& a_dev, + bool fRecovery); void stopRecording(const std::string& start_ts, const std::string& vpath, const std::string& message); @@ -41,6 +46,7 @@ class VideoCaptureApp: public CaptureApp { ~VideoCaptureApp(); // + void onCaptureIdle() override; void onCaptureStart() override; void onCaptureStop(const std::string& message) override; int parseOpts(AppOpts& opts, int argc, char* argv[]) override; diff --git a/Parsing/generate_qrinfo.sh b/Parsing/generate_qrinfo.sh new file mode 100755 index 0000000..af68730 --- /dev/null +++ b/Parsing/generate_qrinfo.sh @@ -0,0 +1,54 @@ +#!/bin/bash + +if [ -z "$1" ]; then + echo "Script to generate QR info JSONL data and logs for ReproNim session with parse_wQR.py tool" + echo "Usage: $0 " + exit 1 +fi + +# Set SESSION_DIR to the first command-line argument +SESSION_DIR=$1 +IN_DIR=$SESSION_DIR/reprostim-videos +OUT_DIR=$SESSION_DIR/timing-reprostim-videos +LOG_LEVEL=DEBUG + +echo "Generating QR info reprostim videos in session: $SESSION_DIR" +echo "Session reprostim video directory: $IN_DIR" +echo "QR info and logs will be saved to: $OUT_DIR" + +# Create the out directory if it does not exist +if [ ! -d "$OUT_DIR" ]; then + mkdir -p "$OUT_DIR" + echo "Created directory: $OUT_DIR" +fi + +# Count the number of .mkv files +total_files=$(ls "$IN_DIR"/*.mkv 2>/dev/null | wc -l | xargs) +echo "Total *.mkv files count: $total_files" +counter=1 + +# Iterate over .mkv files in IN_DIR +for file in "$IN_DIR"/*.mkv; +do + base_name=$(basename "$file" .mkv) + echo "Processing $counter/$total_files : $file..." + # this is normal video parsing: + #./parse_wQR.py --log-level $LOG_LEVEL $file >$OUT_DIR/$base_name.qrinfo.jsonl 2>$OUT_DIR/$base_name.qrinfo.log + + # but we have invalid videos, so cleanup it first + tmp_mkv_file=$OUT_DIR/$base_name.mkv + echo "Generating tmp *.mkv file $tmp_mkv_file..." + ffmpeg -i $file -an -c copy $tmp_mkv_file + ./parse_wQR.py --log-level $LOG_LEVEL $tmp_mkv_file >$OUT_DIR/$base_name.qrinfo.jsonl 2>$OUT_DIR/$base_name.qrinfo.log + if [ -e "$tmp_mkv_file" ]; then + echo "Deleting tmp *.mkv file: $tmp_mkv_file" + rm "$tmp_mkv_file" + fi + + counter=$((counter + 1)) +done + +# Generate QR info +#echo "Generating QR info data..." +#./parse_wQR.py --log-level $LOG_LEVEL $SESSION_DIR >$OUT_DIR/dump_qrinfo.jsonl 2>$OUT_DIR/dump_qrinfo.log +#echo "dump_qrinfo.py exit code: $?" diff --git a/Parsing/parse_wQR.py b/Parsing/parse_wQR.py index 11ea614..062512a 100755 --- a/Parsing/parse_wQR.py +++ b/Parsing/parse_wQR.py @@ -5,6 +5,7 @@ import os import re from datetime import datetime, timedelta +from pathlib import Path from re import match from typing import Optional @@ -22,6 +23,15 @@ logging.getLogger().addHandler(logging.StreamHandler(sys.stderr)) logger.debug(f"name={__name__}") +# Define class video info details +class InfoSummary(BaseModel): + path: Optional[str] = Field(None, description="Video file path") + rate_mbpm: Optional[float] = Field(0.0, description="Video file 'byterate' " + "in MB per minute.") + duration_sec: Optional[float] = Field(0.0, description="Duration of the video " + "in seconds") + size_mb: Optional[float] = Field(0.0, description="Video file size in MB.") + # Define class for video time info class VideoTimeInfo(BaseModel): @@ -175,12 +185,44 @@ def finalize_record(ps: ParseSummary, return record +def do_info_file(path: str): + logger.info(f"do_info_file({path})") + vti: VideoTimeInfo = get_video_time_info(path) + if not vti.success: + logger.error(f"Failed parse file name time pattern, error: {vti.error}") + return + o: InfoSummary = InfoSummary() + o.path = path + o.duration_sec = round(vti.duration_sec, 1) + size: float = os.path.getsize(path) + o.size_mb = round(size/(1000*1000), 1) + if o.duration_sec>0.0001: + o.rate_mbpm = round(size*60/(o.duration_sec*1000*1000), 1) + return o + + +def do_info(path: str): + p = Path(path) + if p.is_file(): + yield do_info_file(path) + elif p.is_dir(): + logger.info(f"Processing video directory: {path}") + for root, _, files in os.walk(path): + for file in files: + if file.endswith('.mkv'): + yield do_info_file(os.path.join(root, file)) + # Uncomment to visit only top-level dir + # break + else: + logger.error(f"Path not found: {path}") + + def do_parse(path_video: str): ps: ParseSummary = ParseSummary() vti: VideoTimeInfo = get_video_time_info(path_video) if not vti.success: - logger.error(f"Failed parse file name time patter, error: {vti.error}") + logger.error(f"Failed parse file name time pattern, error: {vti.error}") return logger.info(f"Video start time : {vti.start_time}") @@ -292,13 +334,21 @@ def do_parse(path_video: str): @click.command(help='Utility to parse video and locate integrated ' 'QR time codes.') @click.argument('path', type=click.Path(exists=True)) +@click.option('--mode', default='PARSE', + type=click.Choice(['PARSE', 'INFO']), + help='Specify execution mode. Default is "PARSE", ' + 'normal execution. ' + 'Use "INFO" to dump video file info like duration, ' + 'bitrate, file size etc, (in this case ' + '"path" argument specifies video file or directory ' + 'containing video files).') @click.option('--log-level', default='INFO', type=click.Choice(['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL']), help='Set the logging level') @click.pass_context -def main(ctx, path: str, log_level): +def main(ctx, path: str, mode: str, log_level): logger.setLevel(log_level) logger.debug("parse_wQR.py tool") logger.debug(f"Working dir : {os.getcwd()}") @@ -308,8 +358,14 @@ def main(ctx, path: str, log_level): logger.error(f"Path does not exist: {path}") return 1 - for item in do_parse(path): - print(item.json()) + if mode=="PARSE": + for item in do_parse(path): + print(item.model_dump_json()) + elif mode=="INFO": + for item in do_info(path): + print(item.model_dump_json()) + else: + logger.error(f"Unknown mode: {mode}") return 0 diff --git a/containers/reprostim-timesync/Dockerfile b/containers/reprostim-timesync/Dockerfile index f138a0e..7a9cc74 100644 --- a/containers/reprostim-timesync/Dockerfile +++ b/containers/reprostim-timesync/Dockerfile @@ -41,10 +41,13 @@ RUN apt-get update -qq \ libwxgtk-webview3.2-dev \ libwxgtk3.2-dev \ ncdu \ + pavucontrol \ pigz \ pkg-config \ portaudio19-dev \ procps \ + pulseaudio \ + pulseaudio-utils \ python3 \ python3-pip \ strace \ @@ -56,7 +59,7 @@ RUN apt-get update -qq \ && rm -rf /var/lib/apt/lists/* RUN git clone https://github.com/wieluk/psychopy_linux_installer/ /opt/psychopy-installer; cd /opt/psychopy-installer; git checkout 21b1ac36ee648e00cc3b68fd402c1e826270dad6 RUN /opt/psychopy-installer/psychopy_linux_installer.sh --install_dir=/opt/psychopy --psychopy_version=2024.1.4 --bids_version=2023.2.0 --python_version=3.10.14 --wxpython_version=4.2.1 -v -f -RUN /opt/psychopy/psychopy_*/bin/pip install qrcode +RUN /opt/psychopy/psychopy_*/bin/pip install qrcode pyzbar opencv-python numpy click pydantic sounddevice scipy pydub pyaudio reedsolo psychopy-sounddevice RUN bash -c 'ln -s /opt/psychopy/psychopy_*/bin/psychopy /usr/local/bin/' RUN bash -c 'b=$(ls /opt/psychopy/psychopy_*/bin/python3); echo -e "#!/bin/sh\n$b \"\$@\"" >| /usr/local/bin/python3; chmod a+x /usr/local/bin/python3' ENTRYPOINT ["python3"] @@ -104,6 +107,9 @@ RUN printf '{ \ "libusb-1.0-0-dev", \ "portaudio19-dev", \ "libasound2-dev", \ + "pulseaudio", \ + "pavucontrol", \ + "pulseaudio-utils", \ "vim", \ "wget", \ "strace", \ @@ -124,7 +130,7 @@ RUN printf '{ \ { \ "name": "run", \ "kwds": { \ - "command": "apt-get update -qq \\\\\\n && apt-get install -y -q --no-install-recommends \\\\\\n build-essential \\\\\\n curl \\\\\\n git \\\\\\n gnupg \\\\\\n less \\\\\\n libasound2-dev \\\\\\n libcanberra-gtk3-module \\\\\\n libgtk-3-dev \\\\\\n libusb-1.0-0-dev \\\\\\n libwxgtk-media3.2-dev \\\\\\n libwxgtk-webview3.2-dev \\\\\\n libwxgtk3.2-dev \\\\\\n ncdu \\\\\\n pigz \\\\\\n pkg-config \\\\\\n portaudio19-dev \\\\\\n procps \\\\\\n python3 \\\\\\n python3-pip \\\\\\n strace \\\\\\n sudo \\\\\\n time \\\\\\n tree \\\\\\n vim \\\\\\n wget \\\\\\n && rm -rf /var/lib/apt/lists/*" \ + "command": "apt-get update -qq \\\\\\n && apt-get install -y -q --no-install-recommends \\\\\\n build-essential \\\\\\n curl \\\\\\n git \\\\\\n gnupg \\\\\\n less \\\\\\n libasound2-dev \\\\\\n libcanberra-gtk3-module \\\\\\n libgtk-3-dev \\\\\\n libusb-1.0-0-dev \\\\\\n libwxgtk-media3.2-dev \\\\\\n libwxgtk-webview3.2-dev \\\\\\n libwxgtk3.2-dev \\\\\\n ncdu \\\\\\n pavucontrol \\\\\\n pigz \\\\\\n pkg-config \\\\\\n portaudio19-dev \\\\\\n procps \\\\\\n pulseaudio \\\\\\n pulseaudio-utils \\\\\\n python3 \\\\\\n python3-pip \\\\\\n strace \\\\\\n sudo \\\\\\n time \\\\\\n tree \\\\\\n vim \\\\\\n wget \\\\\\n && rm -rf /var/lib/apt/lists/*" \ } \ }, \ { \ @@ -142,7 +148,7 @@ RUN printf '{ \ { \ "name": "run", \ "kwds": { \ - "command": "/opt/psychopy/psychopy_*/bin/pip install qrcode" \ + "command": "/opt/psychopy/psychopy_*/bin/pip install qrcode pyzbar opencv-python numpy click pydantic sounddevice scipy pydub pyaudio reedsolo psychopy-sounddevice" \ } \ }, \ { \ diff --git a/containers/reprostim-timesync/Singularity b/containers/reprostim-timesync/Singularity index 658e03d..05ac70d 100644 --- a/containers/reprostim-timesync/Singularity +++ b/containers/reprostim-timesync/Singularity @@ -47,10 +47,13 @@ apt-get install -y -q --no-install-recommends \ libwxgtk-webview3.2-dev \ libwxgtk3.2-dev \ ncdu \ + pavucontrol \ pigz \ pkg-config \ portaudio19-dev \ procps \ + pulseaudio \ + pulseaudio-utils \ python3 \ python3-pip \ strace \ @@ -65,7 +68,7 @@ git clone https://github.com/wieluk/psychopy_linux_installer/ /opt/psychopy-inst /opt/psychopy-installer/psychopy_linux_installer.sh --install_dir=/opt/psychopy --psychopy_version=2024.1.4 --bids_version=2023.2.0 --python_version=3.10.14 --wxpython_version=4.2.1 -v -f -/opt/psychopy/psychopy_*/bin/pip install qrcode +/opt/psychopy/psychopy_*/bin/pip install qrcode pyzbar opencv-python numpy click pydantic sounddevice scipy pydub pyaudio reedsolo psychopy-sounddevice bash -c 'ln -s /opt/psychopy/psychopy_*/bin/psychopy /usr/local/bin/' @@ -114,6 +117,9 @@ printf '{ \ "libusb-1.0-0-dev", \ "portaudio19-dev", \ "libasound2-dev", \ + "pulseaudio", \ + "pavucontrol", \ + "pulseaudio-utils", \ "vim", \ "wget", \ "strace", \ @@ -134,7 +140,7 @@ printf '{ \ { \ "name": "run", \ "kwds": { \ - "command": "apt-get update -qq\\napt-get install -y -q --no-install-recommends \\\\\\n build-essential \\\\\\n curl \\\\\\n git \\\\\\n gnupg \\\\\\n less \\\\\\n libasound2-dev \\\\\\n libcanberra-gtk3-module \\\\\\n libgtk-3-dev \\\\\\n libusb-1.0-0-dev \\\\\\n libwxgtk-media3.2-dev \\\\\\n libwxgtk-webview3.2-dev \\\\\\n libwxgtk3.2-dev \\\\\\n ncdu \\\\\\n pigz \\\\\\n pkg-config \\\\\\n portaudio19-dev \\\\\\n procps \\\\\\n python3 \\\\\\n python3-pip \\\\\\n strace \\\\\\n sudo \\\\\\n time \\\\\\n tree \\\\\\n vim \\\\\\n wget\\nrm -rf /var/lib/apt/lists/*" \ + "command": "apt-get update -qq\\napt-get install -y -q --no-install-recommends \\\\\\n build-essential \\\\\\n curl \\\\\\n git \\\\\\n gnupg \\\\\\n less \\\\\\n libasound2-dev \\\\\\n libcanberra-gtk3-module \\\\\\n libgtk-3-dev \\\\\\n libusb-1.0-0-dev \\\\\\n libwxgtk-media3.2-dev \\\\\\n libwxgtk-webview3.2-dev \\\\\\n libwxgtk3.2-dev \\\\\\n ncdu \\\\\\n pavucontrol \\\\\\n pigz \\\\\\n pkg-config \\\\\\n portaudio19-dev \\\\\\n procps \\\\\\n pulseaudio \\\\\\n pulseaudio-utils \\\\\\n python3 \\\\\\n python3-pip \\\\\\n strace \\\\\\n sudo \\\\\\n time \\\\\\n tree \\\\\\n vim \\\\\\n wget\\nrm -rf /var/lib/apt/lists/*" \ } \ }, \ { \ @@ -152,7 +158,7 @@ printf '{ \ { \ "name": "run", \ "kwds": { \ - "command": "/opt/psychopy/psychopy_*/bin/pip install qrcode" \ + "command": "/opt/psychopy/psychopy_*/bin/pip install qrcode pyzbar opencv-python numpy click pydantic sounddevice scipy pydub pyaudio reedsolo psychopy-sounddevice" \ } \ }, \ { \ diff --git a/containers/reprostim-timesync/generate_container.sh b/containers/reprostim-timesync/generate_container.sh index 018efc5..0d78a6e 100755 --- a/containers/reprostim-timesync/generate_container.sh +++ b/containers/reprostim-timesync/generate_container.sh @@ -19,11 +19,11 @@ generate() { --install build-essential pkg-config git \ sudo \ libgtk-3-dev libwxgtk3.2-dev libwxgtk-media3.2-dev libwxgtk-webview3.2-dev libcanberra-gtk3-module \ - libusb-1.0-0-dev portaudio19-dev libasound2-dev \ + libusb-1.0-0-dev portaudio19-dev libasound2-dev pulseaudio pavucontrol pulseaudio-utils \ vim wget strace time ncdu gnupg curl procps pigz less tree python3 python3-pip \ --run "git clone https://github.com/wieluk/psychopy_linux_installer/ /opt/psychopy-installer; cd /opt/psychopy-installer; git checkout 21b1ac36ee648e00cc3b68fd402c1e826270dad6" \ --run "/opt/psychopy-installer/psychopy_linux_installer.sh --install_dir=/opt/psychopy --psychopy_version=2024.1.4 --bids_version=2023.2.0 --python_version=3.10.14 --wxpython_version=4.2.1 -v -f" \ - --run "/opt/psychopy/psychopy_*/bin/pip install qrcode" \ + --run "/opt/psychopy/psychopy_*/bin/pip install qrcode pyzbar opencv-python numpy click pydantic sounddevice scipy pydub pyaudio reedsolo psychopy-sounddevice" \ --run "bash -c 'ln -s /opt/psychopy/psychopy_*/bin/psychopy /usr/local/bin/'" \ --run "bash -c 'b=\$(ls /opt/psychopy/psychopy_*/bin/python3); echo -e \"#!/bin/sh\n\$b \\\"\\\$@\\\"\" >| /usr/local/bin/python3; chmod a+x /usr/local/bin/python3'" \ --entrypoint python3