[Go言語] MP4の時間(duration)を取得する

// コマンドラインでffprobeを実行した場合
$ ffprobe src/video.mp4
ffprobe version 4.2.4-1ubuntu0.1 Copyright (c) 2007-2020 the FFmpeg developers
// 省略
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from ‘src/video.mp4’:
Metadata:
major_brand : mp42
minor_version : 0
compatible_brands: mp42mp41isomavc1
creation_time : 2021-07-20T06:13:11.000000Z
Duration: 00:00:14.56, start: 0.000000, bitrate: 1530 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1280×720, 1527 kb/s, 25 fps, 25 tbr, 25 tbn, 50 tbc (default)
Metadata:
creation_time : 2021-07-20T06:13:11.000000Z
handler_name : L-SMASH Video Handler
encoder : AVC Coding

### goでffprobe
$ go get github.com/vansante/go-ffprobe

package main

import (
	"log"
	"time"
	"context"

	ffprobe "github.com/vansante/go-ffprobe"
)

func main() {
	ctx, cancelFn := context.WithTimeout(context.Background(), 5*time.Second)
	defer cancelFn()

	data, err := ffprobe.ProbeURL(ctx, "src/video.mp4")
	if err != nil {
	    log.Panicf("Error getting data: %v", data)
	}
	log.Print(data.Format.Duration())
	
}

$ go run test.go
2021/11/13 21:37:01 14.56s

mp4が作成された日時とdurationが表示される
OKKKKKKKKKKKKKKKKKKKK

[RTSP]VLCを使ってRTP配信を行いたい

macにvlcをdownloadします
https://vlc-media-player.jp.uptodown.com/mac/download

1. VLCを起動し、ファイル -> キャプチャーデバイスを開く

2. ストリーミングの設定
RTCで224.0.0.1でポートを1900に設定

### 受信側
稼働しているvlcとは別にもう一つのvlcを起動します

ファイル -> ネットワークを開く
rtp://@224.0.0.1:1900 を設定します

すると、rtpで受信できることがわかります

おおおおおおおおおおおおおおお
Sugeeeeeeeeeeeeeeeeee

RTSPでは224.0.0.0 ~ 239.255.255.255のアドレスを指定する

うん、これをAmazon Kinesis Video Streams で受信したい

RTSPとは

RTSPとは
-> Real Time Streaming Protocol
-> 映像、音声のリアルタイムなストリーミング配信を制御する為のプロトコル
-> ネットワークカメラがクライアント(NVR, VMS)に配信
*NVRはNetwork Video Recoderの略で録画システム
*VMSはVideo Management Softwareで映像を録画、管理、閲覧するソフトウェア

動画はTCP通信ではなく、UDP通信

### 記述
– 要求資源の位置は「rtsp://」を用いて、TCP554ポート(5554)

なるほど、RTSPの概要はわかりました。

[音声認識] DeepSpeechでvideoのAutoSub(srtファイル)作成

– AutoSub is a CLI application to generate subtile file for any video using DeepSpeech.

### install
$ git clone https://github.com/abhirooptalasila/AutoSub
$ cd AutoSub

### virtual env
$ python3 -m venv sub
$ source sub/bin/activate
$ pip3 install -r requirements.txt
requirementsの中身は以下の通りです。

cycler==0.10.0
numpy
deepspeech==0.9.3
joblib==0.16.0
kiwisolver==1.2.0
pydub==0.23.1
pyparsing==2.4.7
python-dateutil==2.8.1
scikit-learn
scipy==1.4.1
six==1.15.0
tqdm==4.44.1

$ deactivate

### download model & scorer
$ wget https://github.com/mozilla/DeepSpeech/releases/download/v0.9.3/deepspeech-0.9.3-models.pbmm
$ wget https://github.com/mozilla/DeepSpeech/releases/download/v0.9.3/deepspeech-0.9.3-models.scorer
$ mkdir audio output

$ sudo apt-get install ffmpeg
$ ffmpeg -version
ffmpeg version 4.2.4-1ubuntu0.1

今回はyoutubeの動画を使います

これを mp4に変換します。

$ python3 autosub/main.py –file hello.mp4
※main.pyで、modelとscorerのファイルを取得しているため、–model /home/AutoSub/deepspeech-0.9.3-models.pbmm –scorer /home/AutoSub/deepspeech-0.9.3-models.scorerは不要です。

for x in os.listdir():
        if x.endswith(".pbmm"):
            print("Model: ", os.path.join(os.getcwd(), x))
            ds_model = os.path.join(os.getcwd(), x)
        if x.endswith(".scorer"):
            print("Scorer: ", os.path.join(os.getcwd(), x))
            ds_scorer = os.path.join(os.getcwd(), x)

output/hello.srt

1
00:00:06,70 --> 00:00:15,60
a low and low and level how are you have low low and low how are you

2
00:00:16,10 --> 00:00:30,20
i do i am great i wonder for a good i grant it wonder for

3
00:00:32,45 --> 00:00:41,30
now at low halloway hallo hallo hallo how are you

4
00:00:41,90 --> 00:00:43,40
tired

5
00:00:43,55 --> 00:00:50,35
i am angry i'm not so good i'm tired

6
00:00:50,55 --> 00:00:55,95
i'm hungry and not so good

7
00:00:58,10 --> 00:01:07,15
love hollow hollow how are you have to have loved halloo are you

8
00:01:07,30 --> 00:01:16,65
how how low how do how are you allow a love as now how are you

これ、日本語でやりたい & リアルタイム出力したい

[filmora9] 動画編集の始め方

### 1. filmora9インストール
macにfilmora9をインストールします

### 2. filmora9を起動
16:9ワイドスクリーンを選択した状態で、「新しいプロジェクトを作成」を押下します。

### 3. 編集画面表示

– クリップウィンドウ: 動画、音、エフェクト、トランジションなどの素材を選ぶウィンドウ
– タイムラインウィンドウ: 上で選んだクリップを並べて動画にするウィンドウ
– プレビューウィンドウ: タイムラインを再生するウィンドウ

### 4. 動画をドラック&ドロップ
用意した動画を取り込みます。とりあえず適当に3本

### 5. タイトル作成
クリップウィンドウのタイトルタブを選択する

オーナー1を選択し、下にドラッグ&ドロップし、更にダブルクリックしてタイトルを編集します。
適当にMy First Videoとします。

### 6.動画挿入
タイトルに動画をつなげていきます。時間は自由にハサミで編集(切り抜き)できます。

### 7.音声追加

音量のフェードアウトも調整できる

### 8.トランジションの設定
動画の切り替え時にトランジションを設定できる

### 9. videoをエクスポート

なるほど、なんか凄え。こんな簡単にできるんや。。。

[video] modalで動画を表示したい

modal-video.jsを使う場合

	<link rel="stylesheet" type="text/css" href="/css/modal-video.min.css">
	
</head>
<body>
	<div class="container">
		<div class="video-container">
			<button class="js-modal-btn" data-video-id="${youtube ID}">Videoを開く</button>
			<div class="video-sidebar">
				<h1>Video Test</h1>
				<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. </p>
			</div>
		</div>
		<h1>H1</h1>
		<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. </p>
		<img src="img/img1.jpg" class="object-fit" width="400px" height="200px"><br><br>
	</div>
	<script src="http://code.jquery.com/jquery-2.2.4.min.js"></script>
	<script src="/js/jquery-modal-video.min.js"></script>
	<script>
  		$(".js-modal-btn").modalVideo();
	</script>

jqueryを使っている場合、modal-video.min.jsでは反応しない。jquery-modal-video.min.jsにする必要がある。

### fancyboxのモーダルを使う場合

	<link rel="stylesheet" href="/css/jquery.fancybox.css" type="text/css" media="screen" />
	<style>
		#video {
			display: none;
		}
	</style>
</head>
<body>
	<div class="container">
		<div class="video-container">
			<button class="modal" href="#video">Videoを開く</button>
			<div id="video">
				<video id="player" controls width="640" height="360">
					<source src="/video/hoge.mp4">
				</video>
			</div>
			<div class="video-sidebar">
				<h1>Video Test</h1>
				<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. </p>
			</div>
		</div>
		<h1>H1</h1>
		<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. </p>
		<img src="img/img1.jpg" class="object-fit" width="400px" height="200px"><br><br>
	</div>
	<script src="http://code.jquery.com/jquery-2.2.4.min.js"></script>
	<script type="text/javascript" src="js/jquery.fancybox.js"></script>
	<script>
  		$(function(){
  			$(".modal").fancybox({
  				'onComplete':function(){
  					vidplay();
  				}
  			});
  			function vidplay(){
  				var video = document.getElementById("player");
  				if(video.paused){
  					video.play();
  				} else {
  					video.paused();
  				}
  			}
  		});
	</script>

display noneとして、ボタン押下時にmodalで表示する。
modal-videoでもfancyboxでも、どっちも使えそう。

[video] Webページ背景に動画を表示する方法

代表的な属性
– width
– height
– src
– autoplay
– controls
– muted
– poster(埋め込む動画の変わりに表示する画像ファイルのURLを指定)
– playsinline(全画面のビデオプレイヤーを起動させずにページ内で動画を再生)

### 普通の動画再生

<video src="video/flower.mp4" controls width="320" height="240"></video>

### 背景

<style>
.video-container {
  position: relative;
}

.video-sidebar {
  position: absolute;
  top: 0;
  left: 0;
  width: 30%;
  height: 100%;
  background-color: rgba(255, 255, 255, 0.8); 
}

video {
  width: 100%;
}
</style>

<div class="video-container">
  <video src="video/test.mp4" autoplay playsinline muted loop></video>
  <div class="video-sidebar">
    <h1>Title</h1>
    <p>text</p>
  </div>
</div>

モーダルで表示させたいね。

防犯カメラの仕組み

### 防犯カメラの種類
– ネットワークカメラ(IPカメラ)
L 無線LANや有線LANなどのネットワークの接続機能を持っており、ネットワークを通じて映像を確認できる。
L 本体にSDカードを入れて録画することができる

– Webカメラ
L 一般的に録画機能を持たず、USB接続してメッセージソフトで利用する。安価。

– 防犯カメラ
L 主な用途は防犯、防災、計測・記録

### カメラの形
– ドーム型、バレット型、ボックス型、パンチルトズーム型

### 録画機
カメラ映像を録画する機械のことをDVRという

ネットワークカメラ、IPカメラは無線LANで接続できる。一方、防犯カメラは同軸ケーブル、ビデオケーブルで接続する。いずれも電源は必要。

なるほど、ラズパイじゃなくても良かったのか。まあいいか。

OpenCV+vagrantでmac内蔵カメラが効かない?

ブラウザ上でカメラを起動するのであれば、httpsサーバに変更してChromeでカメラを許可にすれば良いんだが… openCVでカメラ画像の読み込もうとしてエラーになった。。。

import cv2
import numpy as np

cap = cv2.VideoCapture(-1)
while True:

	_, frame = cap.read()
	frame = cv2.resize(frame, (500, 300))

	cv2.imshow('OpenCV web camera', frame)

	k = cv2.waitKey(1)
	if k == 27 or k == 13: break

cap.release()
cv2.destroyAllWindows()

$ python3 app.py
[ WARN:0] global /root/opencv_build/opencv/modules/videoio/src/cap_v4l.cpp (880) open VIDEOIO(V4L2): can’t find camera device
Traceback (most recent call last):
File “app.py”, line 8, in
frame = cv2.resize(frame, (500, 300))
cv2.error: OpenCV(4.5.0-dev) /root/opencv_build/opencv/modules/imgproc/src/resize.cpp:4051: error: (-215:Assertion failed) !ssize.empty() in function ‘resize’

No /dev/video in WSL (1 or 2).が原因っぽいが。。
Videoは今すぐは使わないが、、、
とりあえず動画ファイルの読み込みVideoCapture(‘*.mp4’)で再度やってみよう

cap = cv2.VideoCapture("fuji.mp4")
print(type(cap))
print(cap.isOpened())

$ python3 app.py

False

isOpened()でfalseなので、読み込めてない。

build infoを見る
Video I/O:
DC1394: NO
FFMPEG: NO
avcodec: NO
avformat: NO
avutil: NO
swscale: NO
avresample: NO
GStreamer: NO
v4l/v4l2: YES (linux/videodev2.h)

Video I/Oに問題があるみたい。
なるほど、buildか。。

ビデオカメラの技術

### 光学系
撮像レンズ、光学LPF、ダイクロイックプリズム、CFAなど多岐に弥

撮像レンズ
– 昔は異なる焦点距離を3-4本揃えターゲットに合わせて変えていた
– ズームレンズが開発
– 非球面レンズの導入により、レンズ枚数が減少

ダイクロイックプリズム
– レンズから入射した光線をRGB3色光学像に分解して結像させる光学部品

CFA
– R、G、B、それぞれのカラーフィルターをアレイ状に配置したもの

光学 LPF
– 被写体の高周波成分を落とす

マイクロレンズ
– フォトダイオードの上部にマイクロレンズを設けて光の利用率を向上する

### 撮像デバイス(CCD)
– ビデオカメラもCMOSイメージセンサを使用している

### 撮像管
– 電子ビームを偏向集束させるためにコイルアセンブリが必要
– フェースプレートは光学ガラスでできていて、内面にITOが真空蒸着で作られ、その上に光導電膜が形成される
– 撮像管内部は真空が保たれ、ヒーターで温めれた電子ビームが光導電膜を走査すると、光学像によって、光電効果で蓄積された信号電荷がITOの部分から取り出されていく

### CMOSイメージセンサ
– フォトダイオード(PD)とトランジスタで構成される
– フォトダイオードに蓄積された信号電荷は画素ごとに設けられた増幅器で増幅された後、垂直、水平のシフトレジスタで画素ごとにスイッチングされ、読み出される
※PDとは光を電気に変換する計測用デバイス
※トランジスタとは電子回路において、信号を増幅またはスイッチングすることができる半導体素子
※半導体とは導体と絶縁体の中間の電気伝導率をもつ物質

### ビデオカメラの技術展開
被写体 -> 撮像レンズ -> 光学LPF -> CFA -> 【CMOSセンサ】 -> LPF -> AGC CDS -> ADC -> 【カメラ基本回路】(デジタル信号処理) -> 高画質化・高機能化処理 -> ビューファインダ or 録画装置(VTR/DVD/半導体メモリ) or 出力回路

ビデオカメラやデジカメがネット接続できれば、画像処理のところはMLなどでリアルタイムで色々できそうやな。