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用 本ツール起動中はスリープに入りません


ダウンロード先↓

drive.google.com

 

ハッシュ

SHA-1    6daa5fb715829e9f4fdab6aaa37ff6c7907eb8c7
SHA-256    1547d237000cdf9ff90cf6e85db0d39e78c8ed23f67ca0384042de080597cca2
SHA-512    663180ec32ece9d89ae5ab3f631a9809baaa62dba845198017e763b8abb2a4f2a4489cbb64c7b8d497e1fc3426fc41ec2565ea8c3a3980052df63718c8882ce4

 

(Python)偶数判定プログラムの速度比較

概要

正確には偶数判定ではなく2で割ったあまりの計算方法の速度比較

 

ネットに落ちているプログラムを見ていると

n & 1 == 0

という判定式があった

これはnの下位1ビットが0であるかどうか

つまり、偶数であるかどうかの判定式だが可読性は全くない

でももしかしたら速度が早いのかもと思って比較してみた

 

比較

比較するプログラムは以下

A.

n % 2

B.

n & 1

 

プログラム

import random
import math
import time

startTime = time.time()


def main():
    print("***START***")
 
    test004()

    print("****END****")


def setStartTime():
    global startTime
    startTime = time.time()

def calcProcessTime():
    endTime = time.time()
    elapsedTime = endTime - startTime
    print(f"処理時間: {elapsedTime}秒")
 
def test004():
   
    loop = 100000000
   
    setStartTime()
    # ここに計測したい処理を記述する
    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
f:id:shibi_rr:20211227102048j:plain
after
f:id:shibi_rr:20211227102109j:plain

###########
gif
f:id:shibi_rr:20211227105853g:plain
###########

コード

核の部分だけ

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

プログラムの流れ

f:id:shibi_rr:20211227111503p:plain
元画像
===========================
f:id:shibi_rr:20211227111542p:plain
トリミングした画像
===========================
f:id:shibi_rr:20211227111635p:plain
変更前の部分だけを白にする
===========================
f:id:shibi_rr:20211227111713p:plain
白の部分を任意の色にする
===========================
f:id:shibi_rr:20211227111759p:plain
元の画像と合成する

シェルスクリプト 辞書

自分用メモ

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

ffmpeg、別ドライブアクセス

自分用メモ

別ドライブに移動

Gドライブに移動

G:

接続先をnドライブに設定

net use n: \\000.000.000.000\raspberrypi\

nドライブに移動

cd /d n:

解像度そのままでmp4にエンコード

h264_nvencはNVIDIAGPUを使用する場合

ffmpeg -i aiueo.m2ts -vcodec h264_nvenc aiueo.mp4

1280×720にスケーリングしてエンコード

dual_mono_mode は主音声だけを取り出す

ffmpeg -dual_mono_mode main -i aiueo.m2ts -vf scale=1280:720 -vcodec h264_nvenc -acodec copy -bsf:a aac_adtstoasc aiueo.mp4

音ズレを直す

音声を1秒早める

ffmpeg -ss 1.2 -i aiueo.mp4  -ss 0.2 -i aiueo.mp4 -map 0:a -map 1:v -vcodec copy -max_muxing_queue_size 2048 aiueo2.mp4

カット

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