2020年12月24日木曜日

moviepy 資料

 

moviePyでは、

txt_clip = TextClip("My kuma",fontsize=70,color='white')

でエラーになる
エラー内容
Traceback (most recent call last):
  File "C:\Users\kobay\AppData\Local\Programs\Python\Python38\lib\site-packages\moviepy\video\VideoClip.py", line 1137, in __init__
    subprocess_call(cmd, logger=None)
  File "C:\Users\kobay\AppData\Local\Programs\Python\Python38\lib\site-packages\moviepy\tools.py", line 46, in subprocess_call
    proc = sp.Popen(cmd, **popen_params)
  File "C:\Users\kobay\AppData\Local\Programs\Python\Python38\lib\subprocess.py", line 854, in __init__
    self._execute_child(args, executable, preexec_fn, close_fds,
  File "C:\Users\kobay\AppData\Local\Programs\Python\Python38\lib\subprocess.py", line 1307, in _execute_child
    hp, ht, pid, tid = _winapi.CreateProcess(executable, args,
FileNotFoundError: [WinError 2] 指定されたファイルが見つかりません。

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "mvpy2-1.py", line 7, in <module>
    txt_clip = TextClip("My kuma",fontsize=70,color='white')
  File "C:\Users\kobay\AppData\Local\Programs\Python\Python38\lib\site-packages\moviepy\video\VideoClip.py", line 1146, in __init__
    raise IOError(error)
OSError: MoviePy Error: creation of None failed because of the following error:

[WinError 2] 指定されたファイルが見つかりません。.

.This error can be due to the fact that ImageMagick is not installed on your computer, or (for Windows users) that you didn't specify the path to the ImageMagick binary in file conf.py, or that the path you specified is incorrect


------------------
(program exited with code: 1)

続行するには何かキーを押してください . . .

*ImageMagickがないからである
 参考ページは、

https://higuma.github.io/2016/08/31/imagemagick-1/

です


なにやら、PATH設定でウインドウのコマンドと衝突するみたい

これを見て分かる通りcompare, convert, streamなど他と衝突しそうな名前が多い。特にImageMagickで最も使用頻度が高いconvert.exeは同名のWindowsシステムコマンドと実際に衝突する。



(3) portable版


しかし実はstatic版のインストーラにはPathの設定に関する微妙な問題がある(この後で解説)。またアンインストーラの出来も悪く、設定したPathを元に戻さない。

そのため自分は現在portable版(インストーラなしのstatic版)を使っている。Windows Binary Releaseの最後の2つでportable-Q16-x86が32bit用、portable-Q16-x64が64bit用。

インストールは手動で行う必要があるが、難しいことは何もない。

  • 適当なフォルダに解凍
  • 必要があれば自分でPathを設定する(これで終わり)

(自分もよく忘れるので備忘録) Windowsのパス設定は「コントロールパネル→システム→システムの詳細設定→環境変数(N)…」。

アンインストールも自力だが、インストール時作業の逆を行えばいい。

  • フォルダ丸ごと削除
  • もしPathを設定していたら削除

インストーラはよく知らない場所にファイルやレジストリを書き込むし、アンインストーラを実行しても元通りに掃除してくれないことが多い(ゴミが残る)。この方法だとそのような心配が全くないのが大きなメリット


が良いみたい!

config.pyに

IMAGEMAGICK_BINARY = “C:\Program Files\ImageMagick_VERSION\convert.exe”

をついかする


自分のPCでは、以下のフォルダにある

C:\Users\kobay\AppData\Local\Programs\Python\Python38\Lib\site-packages\moviepy



Once you have installed it, ImageMagick will be automatically detected by MoviePy, except on Windows !. Windows user, before installing MoviePy by hand, go into the moviepy/> config_defaults.py file and provide the path to the ImageMagick binary called convert. It should look like this

IMAGEMAGICK_BINARY = “C:\Program Files\ImageMagick_VERSION\convert.exe”




Once you have installed it, ImageMagick will be automatically detected by MoviePy, except on Windows !. Windows user, before installing MoviePy by hand, go into the moviepy/> config_defaults.py file and provide the path to the ImageMagick binary called convert. It should look like this

IMAGEMAGICK_BINARY = “C:\Program Files\ImageMagick_VERSION\convert.exe”

 


2020年11月29日日曜日

ディスプレイ 解像度

設定画面で調べてみました

(何回も調べるのが嫌になったので)


数字が丁度なのは

こんな感じかな?

1920 * 1080

1680 * 1050

1600 * 900

1440 * 900

1280 * 960

1280 * 720

800 * 600

何か、人間の思惑がみえる~


丁度なのをおぼえよう~と

1920 * 1080ハイビジョン

wowow web magazin

に分かりやすい説明がありました、ありがとう!

要するに!

SD (720*480)

HD (1280*720)

FULL HD(1920*1080)

4K(3840*2160)

8K(7680*4320)

いろいろあるから嫌だが

これぐらは、常識になりそうだ!

(自分の寿命から考えて!)





 








2020年11月28日土曜日

moviepy でsubclipがうまく取得できない

moviepy でsubclipしてファイル出力だが、

エラーになる

こちらでが出てしまう

Moviepy - Building video VandA-mpy.mp4.

MoviePy - Writing audio in VandA-mpyTEMP_MPY_wvf_snd.mp3

MoviePy - Done.

Moviepy - Writing video VandA-mpy.mp4


Moviepy - Done !

Moviepy - video ready VandA-mpy.mp4

Exception ignored in: <function FFMPEG_AudioReader.__del__ at 0x000001FB240784C0>

Traceback (most recent call last):

  File "C:\Users\kobay\AppData\Local\Programs\Python\Python38\lib\site-packages\moviepy\audio\io\readers.py", line 254, in __del__

    self.close_proc()

  File "C:\Users\kobay\AppData\Local\Programs\Python\Python38\lib\site-packages\moviepy\audio\io\readers.py", line 149, in close_proc

    self.proc.terminate()

  File "C:\Users\kobay\AppData\Local\Programs\Python\Python38\lib\subprocess.py", line 1442, in terminate

    _winapi.TerminateProcess(self._handle, 1)

OSError: [WinError 6] ハンドルが無効です。



ネットで調べると、あるある!

原因は、ffmpegのバージョンかも?!



面白いことに、subclipのスタート位置を30秒より多くするとエラーになる

29秒以下なら大丈夫なのだ!


また、もっと面白いのは、このソースは関数になっているが

関数呼び出しにしないと、全然OK、すべて正常になってしまった。

しかしながら、関数化できないとはバグか?

環境(インストール。。)なのかな?



ソース

 import moviepy.editor as mp

def main123(  ):

    video = mp.VideoFileClip( "VandA.mp4" )

    video = video.subclip( 30, 30+1)

    video.write_videofile("VandA-mpy.mp4", fps=1)


main123()

# //video = mp.VideoFileClip( "VandA.mp4" )

# //video = video.subclip( 30, 30+1)

# //video.write_videofile("VandA-mpy.mp4", fps=1)



pip install ffmpeg-pyth

ffmegが怪しいとのことで、直接パイソンから使ってみた。

pip install ffmpeg-pyth

してから

次を実行

import ffmpeg


stream = ffmpeg.input('VandA.mp4')

stream = ffmpeg.output(stream, 'VandA-mpeg.mp4',t=50,ss=100)

ffmpeg.run(stream)


エラーなくできた、なーんだffmpegいいじゃん!
と言うと怪しいのは、moviePyじゃ

moviePyは、なにか.....








参考URL ffmpegを直接動かす

cv2で単純に、動画を表示する方法(途中です)

 サンプル1

 動画ファイルを表示させる


import cv2


        src = cv2.VideoCapture( r"C:\Users\kobay\Documents\py\outFN.mp4")


        while True:

            retval, frame = src.read()

            # 最後まできた

            if frame is None:

                break

               key = cv2.waitKey(0)


img_in = cv2.resize( frame, (int(w*0.5), int(h*0.5)))

            img_out2 = cv2.resize( img_out, (int(w*0.5), int(h*0.5)))

            cv2.imshow(self.windowName_in, img_in)

            cv2.imshow( "windowName",  img_in )

            



self.play_obj.stop()

                dispGamen( self.start_frame ) 


                key = cv2.waitKey( 0  )

                pt = self.src.get(cv2.CAP_PROP_POS_FRAMES)

                pt0 = (pt/20) *1000

                sound  = sound0[ pt0: ]


                self.play_obj = sa.play_buffer(

                    sound.raw_data,

                    num_channels=sound.channels,

                    bytes_per_sample=sound.sample_width,

                    sample_rate=sound.frame_rate

                )



2020年11月12日木曜日

開発日記 11・11

 動画編集ソフト


*動画の再生でfspに関係なく、適切なスピードで再生できるように修正した

 waitkeyでるーぷさせ、実時間とフレームスピードの再生時間を同期させた

ソースコード


*お絵描ソフトで、線がとんだ場合の処理を考える



2020年10月18日日曜日

jQuery uncompressedとslim

 uncompressedは読めるが、minifiedは読みにくい

slimは、ajax、effectsモジュールがない

slim minifiedは、ajax、effectsモジュールがないし圧縮されている

minifiedが無難な選択である

しかしながら、自分は、uncompressedが好きである。






2020年7月5日日曜日

MySQL 基礎




# MySQLdbのインポート

import MySQLdb
 
# データベース接続
connection = MySQLdb.connect(
    user='root',
    db='test_db')

#カーソルの生成
cursor = connection.cursor()
# ここに実行コード
#
# 保存
connection.commit()
# 接続をクローズ
connection.close()



# データの追加
sql = "INSERT INTO name_list VALUES( 1, 'kobayashi' )"
cursor.execute( sql )

# データの追加(プレースフォルダ)
sql = "INSERT INTO name_list VALUES(  %s, %s )"
cursor.execute( sql、( 1, 'kobayashi' ) )

※項目が1つならコンマが必要です
cursor.execute( sql、( 1,  ))

# データの追加(複数件)
data = [
        (2, 'yamada'),
        (3, 'takahasi')
    ]
c.executemany(sql, data)    # 複数件登録




cursor.execute("SELECT * FROM name_list")

# fetchoneで取り出し
rows = cursor.fetchone()
print( "カラム1", rows[0] )
print( "カラム2", rows[1] )

 
# すべて取り出し
cursor.execute("SELECT * FROM name_list")
for row in cursor:
    print(row)
 

2020年6月22日月曜日

pygame 音声ファイルを再生後に、書き換えできない(パーミッションエラー、プロセスが使用中)


クローズをしないと、プロセスが使用しているので
ファイルを消したり
ファイルを書き換えたりできない。

結構、ネット上には悩んでいる人が多かった。
mmapなどでもやったがダメ。
別ファイルで利用する例が多かったが、同じファイル名で処理したい場合はダメ。


そこで、
結論は以下のように、自分でファイルをオープンして
ファイルオブジェクトで音楽ファイルを取得すると大丈夫。
最後に後始末、music.stopをしてクローズする

クローズ後には、ファイルを自分で自由に使う事ができますよ!
書き換えたり、削除したり


f=open('test.wav')
pygame.mixer.music.load(f)
f.close()

2020年6月16日火曜日

ホームページの引っ越し(net.programming.jpをsimple-and-useful.netへ)

ずっと、運用していたページを閉めることにしました。

理由は、アクセスが少ないのと
メンテナンスが複数ページあると大変だからです。

以下のソフトで引っ越し作業を行っています
WinSCP

やり方は、サーバーからPCにダウンロード
そして、引っ越し先のサーバーにアップロード

経過の報告

所定のところに、フォルダを作成した
元から、フォルダごと移動させた。

結構快適に、引っ越しできている
バイナリー、アスキー転送も問題なく行われているようです。
確認しながらの作業です

2020年5月16日土曜日

Python エラーを克服する

Pythonにはどんなエラーがあるのでしょう?


例外クラスをつくるには
class ParamError(Exception):
 
    pass
 
def sample(num):
    if type(num)!=int:
        raise ParamError('パラメータが不正です')
  
    return num * 10



サンプル デバッグに便利
import traceback try: raise Exception except: with open("error.log", 'a') as f: traceback.print_exc(file=f



class minError(Exception): pass while True: try: x = int(input("Please enter a number: ")) """ if x <0: raise minError("") """ if x <0 or x>100: raise ValueError break except ValueError as e: print("Try again",e) except minError: print("error Try again")


























ちょっと調べてみました



BaseException
 +-- SystemExit
 +-- KeyboardInterrupt
 +-- GeneratorExit
 +-- Exception
      +-- StopIteration
      +-- StopAsyncIteration
      +-- ArithmeticError
      |    +-- FloatingPointError
      |    +-- OverflowError
      |    +-- ZeroDivisionError
      +-- AssertionError
      +-- AttributeError
      +-- BufferError
      +-- EOFError
      +-- ImportError
      |    +-- ModuleNotFoundError
      +-- LookupError
      |    +-- IndexError
      |    +-- KeyError
      +-- MemoryError
      +-- NameError
      |    +-- UnboundLocalError
      +-- OSError
      |    +-- BlockingIOError
      |    +-- ChildProcessError
      |    +-- ConnectionError
      |    |    +-- BrokenPipeError
      |    |    +-- ConnectionAbortedError
      |    |    +-- ConnectionRefusedError
      |    |    +-- ConnectionResetError
      |    +-- FileExistsError
      |    +-- FileNotFoundError
      |    +-- InterruptedError
      |    +-- IsADirectoryError
      |    +-- NotADirectoryError
      |    +-- PermissionError
      |    +-- ProcessLookupError
      |    +-- TimeoutError
      +-- ReferenceError
      +-- RuntimeError
      |    +-- NotImplementedError
      |    +-- RecursionError
      +-- SyntaxError
      |    +-- IndentationError
      |         +-- TabError
      +-- SystemError
      +-- TypeError
      +-- ValueError
      |    +-- UnicodeError
      |         +-- UnicodeDecodeError
      |         +-- UnicodeEncodeError
      |         +-- UnicodeTranslateError
      +-- Warning
           +-- DeprecationWarning
           +-- PendingDeprecationWarning
           +-- RuntimeWarning
           +-- SyntaxWarning
           +-- UserWarning
           +-- FutureWarning
           +-- ImportWarning
           +-- UnicodeWarning
           +-- BytesWarning
           +-- ResourceWarning

Python エラー処理

エラー処理は、この形を覚えること!

try:
    処理1
    処理2
    処理3
expect:
    print("エラー発生")
else:
    print("エラーが無かった(よかった)")
finally:

    print("すべての道は、ここに!")


2020年3月21日土曜日

デバッグ注意

関数値の戻り値の型に注意!



以下をみてもらいたい
なぜか、
実際にはバグでFalseでなく0が返却されてと仮定します。

if文で比較時にキャストされてしまい、Falseになるのです。

>>> a
0
>>> bool(a)
False



a=func1()
#a=0
if a== False :print "OK" # OKが出力された


>>> assert isinstance( a, bool )
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError




改善策
func1は、数字が返却とは、想定していなかった
==>assertを使用して関数の戻り値をチェックする

a=func1()
#a=0

assert isinstance( a, bool )
if a== False :print "OK" # OKが出力された


*ちょっと一般的に設計したがる戻り値

正常の場合は、整数値を返却する
エラーの場合は、Falseを返却

例題で、こんなものはどうだろうか?
あまり処理内容は意味がないが
(ただし、戻り値0もあり)

def func2(num):

 data  = num * 2 -10
 if data <0:
  return False
else:
 return data


ret = func2( 5 )
if ret == False :
 print("error")
else:
 print("num=", ret)

改善策!
if  isinstance( ret, bool ) and ret == False :
 print("error")
else:
 print("num=", ret)

でも、もっと良い方法がある「is」を使うのである
「is」は同一オブジェクトかを判定する。

if  ret is False :
 print("error")
else:
 print("num=", ret)




個々のオブジェクト(インスタンス)には、idが振られている。
id( 調べたいオブジェクト )で調べられ、同一オブジェクト化を判定できる


結論
・if文で比較の場合、
比較がTrueかFalseしかないと断言できる場合は
if data:~
if not data:~
がわかりやすい!
しかし、assertを入れておくと保険になりますよ!

・if文で比較の場合、
比較がTrueかFalseしかないと断言が心配なら
if data is True等がベストです。

※「==」は、キャストが行われるので…




assertは,
__debug__(組み込み定数)がTrueの時実行、通常はTrue
assertさせないは、
起動時のコマンドラインのオプションで「-O」にする
(同時に__debug__がFalseになる)


結論2
Noneも同様がわかりやすいね(スピードがはやい)
 if data is None: ~

まとめ
if data is True:~
if data is False:~
if data is None:~
if data is not None:~

2020年3月20日金曜日

Python 関数の引数チェック

ここでは、
aasertを使用して関数の引数をチェックしてみます!

プログラムが安定するまでは、コーディングにのこしておくといいものかな?
パイソンの起動パラメータで -Oで、無効にできますしね!


例)
def add(a, b):    
   assert isinstance(a, int) and isinstance(b, int), '引数を int型し!
   c = a + b

add(123, '10')



もちろん、こんなコーディングは、ほとんどないけど
関数からの値を渡す場合などは、このようなケースはあり得ます。


data1= 123
data2= funcA()
add( data1, data2)

なら結構やってしまうエラーかもしれません、
funcAにバグが無いとは誰もわかりません!
これを書いておくとヒューマンエラー的にもいいのかな?!