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

                )