2020年12月31日木曜日
2020年12月24日木曜日
moviepy 資料
moviePyでは、
txt_clip = TextClip("My kuma",fontsize=70,color='white')
https://higuma.github.io/2016/08/31/imagemagick-1/
です
なにやら、PATH設定でウインドウのコマンドと衝突するみたい
(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年12月20日日曜日
2020年12月4日金曜日
2020年11月29日日曜日
ディスプレイ 解像度
設定画面で調べてみました
(何回も調べるのが嫌になったので)
数字が丁度なのは
こんな感じかな?
1920 * 1080
1680 * 1050
1600 * 900
1440 * 900
1280 * 960
1280 * 720
800 * 600
何か、人間の思惑がみえる~
丁度なのをおぼえよう~と
1920 * 1080ハイビジョン
に分かりやすい説明がありました、ありがとう!
要するに!
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)
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月16日月曜日
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 基礎
2020年6月22日月曜日
pygame 音声ファイルを再生後に、書き換えできない(パーミッションエラー、プロセスが使用中)
2020年6月16日火曜日
ホームページの引っ越し(net.programming.jpをsimple-and-useful.netへ)
2020年5月16日土曜日
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 エラー処理
2020年4月19日日曜日
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にバグが無いとは誰もわかりません!
これを書いておくとヒューマンエラー的にも
いいのかな?!