ffmpeg、m2ts徹底攻略
できること
m2tsファイルの情報を取得する
ffmpeg -i video.m2ts
○解説
実行すると下図のような結果が表示されます

ファイルに含まれる情報(下記)
- 映像
- 音声
- 字幕
が表示されます
サブチャンネルや副音声の抽出に使います
ここをクリック
m2tsファイルをmp4に変換する
ffmpeg -i videoInput.m2ts -vcodec copy videoOutput.mp4
m2tsファイルを解像度を変えてmp4(1280×720)に変換する
CPU Ver
ffmpeg -dual_mono_mode main -i videoInput.m2ts -vf scale=1280:720 -vcodec copy -bsf:a aac_adtstoasc videoOutput.mp4
GPU Ver (h264_nvenc)
ffmpeg -dual_mono_mode main -i videoInput.m2ts -vf scale=1280:720 -vcodec h264_nvenc -bsf:a aac_adtstoasc videoOutput.mp4
mp4ファイルをビットレートを指定してmp4に変換する
ffmpeg -i "videoInput.mp4" -movflags +faststart -c:a aac -profile:a aac_low -ac 2 -ar 48000 -c:v libx264 -vf yadif=0:-1:1 -profile:v high -bf 2 -g 30 -coder 1 -b:v 1.5M -b:a 128k -pix_fmt yuv420p -threads 4 "videoOutput.mp4"
○解説
・ビットレート
1.5M
ここに変換したいビットレートを指定します
・スレッド数
threads 4
ここに変換処理に利用するスレッド数を指定します
ファンがうるさくなる場合はこの数値を下げるといいです
※補足
この変換をするとストリーム再生向きのファイルになります(おそらく)
仮にWebサーバを立ててスマホからファイルにアクセスする場合、読込み時間がかなり短縮されます
音ズレを直す
ffmpeg -ss 0.0 -i videoInput.mp4 -ss -1.1 -i videoInput.mp4 -map 0:a -map 1:v -vcodec copy -max_muxing_queue_size 2048 videoOutput.mp4
動画の一部を切り出す
0分0秒から30分0秒までを抽出する
ffmpeg -ss 00:00:00 -to 00:30:00 -i videoInput.mp4 -vcodec copy -acodec copy videoOutput.mp4
動画を結合する
○下準備
merge_list.txtを準備する(内容は下記)
file videoInput1.mp4 file videoInput2.mp4 file videoInput3.mp4
○コマンド実行
ffmpeg -f concat -i merge_list.txt -c copy videoOutput.mp4
※補足
- merge_list.txt
- videoInput1.mp4
- videoInput2.mp4
- videoInput3.mp4
は同じディレクトリにおきます
~~
字幕を抽出する
下記のツールが必要です
github.com
Code→Zipをダウンロードする
Caption2AssC.exeのあるディレクトリに移動した後下記を実行します
Caption2AssC.exe -format srt "videoInput.m2ts" "srtOutput"
副音声を抽出する

ファイル情報が↑のとき以下のコマンドで副音声で動画を抽出できます
ffmpeg -i videoInput.m2ts -vcodec copy -map 0:1 -acodec copy -map 0:3 videoOutput.mp4
以下は工事中
副音声を追加する
あああ
ffmpeg -i fig/aaaa%03d.jpg -pix_fmt rgb24 -f gif output.gif
ああ
ffmpeg -i videoInput.mp4 -ab 128k soundOutput.mp3
できないこと
m2tsファイルから番組名を取得する方法
あああ
ああ
あああ
ああ
あああ
ああ
あ
スリープ回避ツール
スリープ回避するツールです
Windows用 本ツール起動中はスリープに入りません

ダウンロード先↓
ハッシュ
SHA-1 6daa5fb715829e9f4fdab6aaa37ff6c7907eb8c7
SHA-256 1547d237000cdf9ff90cf6e85db0d39e78c8ed23f67ca0384042de080597cca2
SHA-512 663180ec32ece9d89ae5ab3f631a9809baaa62dba845198017e763b8abb2a4f2a4489cbb64c7b8d497e1fc3426fc41ec2565ea8c3a3980052df63718c8882ce4
(Python)偶数判定プログラムの速度比較
概要
正確には偶数判定ではなく2で割ったあまりの計算方法の速度比較
ネットに落ちているプログラムを見ていると
n & 1 == 0
という判定式があった
これはnの下位1ビットが0であるかどうか
つまり、偶数であるかどうかの判定式だが可読性は全くない
でももしかしたら速度が早いのかもと思って比較してみた
比較
比較するプログラムは以下
A.
n % 2
B.
n & 1
プログラム
import randomimport mathimport time
startTime = time.time()
def main():print("***START***")test004()
print("****END****")
def setStartTime():global startTimestartTime = time.time()
def calcProcessTime():endTime = time.time()elapsedTime = endTime - startTimeprint(f"処理時間: {elapsedTime}秒")def test004():loop = 100000000setStartTime()# ここに計測したい処理を記述するfor i in range(loop):mod2A(i)
calcProcessTime()# ------------
setStartTime()for i in range(loop):mod2B(i)calcProcessTime()
def mod2A(n):return n % 2
def mod2B(n):return n & 1
結果

Aが上
Bが下
結論
n % 2
の方が早い
画像の一部色変更(OpenCV)
色変更カスタム
できたもの
before

after

###########
gif

###########
コード
核の部分だけ
def trans_color(img_in ,after_color, hmin , hmax , smin, smax ,vmin , vmax ):
im_trim = img_in.copy()
# 範囲 0 ≤ H ≤ 179、0 ≤ S ≤ 255、0 ≤ V ≤ 255
it1 = ext_red_B_R(im_trim , hmin , hmax , smin , smax , vmin , vmax )
mask = cv2.cvtColor( it1 , cv2.COLOR_BGR2GRAY)
prnim_gray(mask)
mask = np.where(mask == 255 , 0 , 1 )
mask = (mask).astype(np.uint16)
im_trim16 = (im_trim).astype(np.uint16)
im_trim16[:,:,0] = np.where(im_trim16[:,:,0] == 0 , 256 , im_trim16[:,:,0] )
im_trim16[:,:,1] = np.where(im_trim16[:,:,1] == 0 , 256 , im_trim16[:,:,1] )
im_trim16[:,:,2] = np.where(im_trim16[:,:,2] == 0 , 256 , im_trim16[:,:,2] )
im_trim16[:,:,0] = im_trim16[:,:,0] * mask
im_trim16[:,:,1] = im_trim16[:,:,1] * mask
im_trim16[:,:,2] = im_trim16[:,:,2] * mask
im_trim16[:,:,0] = np.where(im_trim16[:,:,0] == 0 , after_color[2] , im_trim16[:,:,0] )
im_trim16[:,:,1] = np.where(im_trim16[:,:,1] == 0 , after_color[1] , im_trim16[:,:,1] )
im_trim16[:,:,2] = np.where(im_trim16[:,:,2] == 0 , after_color[0] , im_trim16[:,:,2] )
im_trim16[:,:,0] = np.where(im_trim16[:,:,0] == 0 , after_color[2] , im_trim16[:,:,0] )
im_trim16[:,:,1] = np.where(im_trim16[:,:,1] == 0 , after_color[1] , im_trim16[:,:,1] )
im_trim16[:,:,2] = np.where(im_trim16[:,:,2] == 0 , after_color[0] , im_trim16[:,:,2] )
im_trim16[:,:,0] = np.where(im_trim16[:,:,0] == 256 , 0 , im_trim16[:,:,0] )
im_trim16[:,:,1] = np.where(im_trim16[:,:,1] == 256 , 0 , im_trim16[:,:,1] )
im_trim16[:,:,2] = np.where(im_trim16[:,:,2] == 256 , 0 , im_trim16[:,:,2] )
im_trim = (im_trim16).astype(np.uint8)
return im_trim
プログラムの流れ

元画像
===========================

トリミングした画像
===========================

変更前の部分だけを白にする
===========================

白の部分を任意の色にする
===========================

元の画像と合成する
シェルスクリプト 辞書
自分用メモ
Enter入力まで待機
shell
read -p "Enter" #コメントアウトは#を入れる
bat
pause @rem コメントアウトはat_remを入れる
shellからPython実行
#!/usr/bin/bash cd ~ source ./pyenvs/XXXX/YYYY/Scripts/activate cd `dirname $0` #シェルスクリプトのディレクトリに移動 python filename.py # ラズパイで実行するときは python3 とする start . #今のディレクトリのフォルダを開く read -p "Enter" #Enterで次へ進む
10秒待機
sleep 10
C言語で別プログラム実行(.c)
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int main(void) {
system("start filename.sh");
return (0);
}
Pythonからshell実行
非同期実行
import subprocess
from subprocess import PIPE
print('start')
popen_obj = subprocess.Popen(['./'+sh_name])
print(popen_obj)
print('end')
ファイルを移動させる
move *.mp4 ./sample
カット
ffmpeg -ss 00:00:00 -to 00:30:00 -i aiueo.mp4 -vcodec copy -acodec copy aiueo_00.mp4
始めから指定時間まで
ffmpeg -i aiueo.mp4 -t 00:30:00 -c copy aiueo_01.mp4
途中から終わりまで
ffmpeg -ss 00:30:00 -i aiueo.mp4 -c copy aiueo_00.mp4
gif作成
ffmpeg -i fig/aaaa%03d.jpg -pix_fmt rgb24 -f gif output.gif