저는 취미 프로그래머이며, 파이썬을 사용하여 우분투에서 스크린 레코더를 만들려고합니다. 이 코드를 사용하여 스크린 샷을 찍을 수 있습니다.우분투의 스크린 레코더, 파이썬을 사용합니다.
import wx
app = wx.App(False)
s = wx.ScreenDC()
w, h = s.Size.Get()
b = wx.EmptyBitmap(w, h)
m = wx.MemoryDCFromDC(s)
m.SelectObject(b)
m.Blit(0, 0, w, h, s, 0, 0)
m.SelectObject(wx.NullBitmap)
b.SaveFile("screenshot.png", wx.BITMAP_TYPE_PNG)
내가 더 많은 사진을 가지고 우는 소리 주어진다이 화면 shots.My 코드를 사용하여 비디오를 만들 루프를 사용하여, 위의 코드에서
import wx,os
app=wx.App(False)
s = wx.ScreenDC()
w, h = s.Size.Get()
b = wx.EmptyBitmap(w, h)
m = wx.MemoryDCFromDC(s)
i=0
while i<50:
m.SelectObject(b)
m.Blit(0, 0, w, h, s, 0, 0)
m.SelectObject(wx.NullBitmap)
b.SaveFile('{0:05d}.png'.format(i), wx.BITMAP_TYPE_PNG)
i+=1
os.system('ffmpeg -f image2 -r 8 -i %05d.png -vcodec mpeg4 -y movie1.mp4')
i=0
while i<50:
os.remove('{0:05d}.png'.format(i))
i += 1 `
나는 00049에 00000.png으로 50 개 사진 저장을 .png 및 ffmpeg를 사용하여 비디오를 만듭니다. 비디오를 만든 후 모든 사진을 삭제합니다.
현재 문제 : 스크린 촬영 사이
- 아주 약간의 지연. 이 코드를 사용하여 비디오를 녹화하려고하면 put이 완벽하지 않습니다.
- 장시간 녹음 할 경우 효율적이지 않습니다. 스크린 샷을 저장하기 위해 많은 하드 드라이브 메모리가 필요합니다. 그리고 더 많은 CPU를 사용하십시오.
코드를보다 효율적으로 만들려면 어떻게해야합니까? 순수한 파이썬을 사용하여 사진에서 비디오를 만드는 방법? 화면을 기록하는 다른 방법이 있습니까? 코드를 개선하고 싶습니다.
+1 잘 생각한 질문입니다. 지금은 테스트 할 수 없지만 이미 ffmpeg를 사용하고 있다면 이미지없이 화면을 녹화 할 수 있습니다. 이 예제를 약간 변경하여 매뉴얼 페이지에서 5 초 동안 스크린을 기록한 다음 멈추게했다. ffmpeg -f x11grab -s cif -r 25 -i : 0.0 /tmp/out.mpg -t 5' –
side note : while 루프를 작성하고 수동으로 카운터를 증가 시키면 혼란스럽고 장황하며 fencepost 오류가 발생할 가능성이 높습니다. 'for this in range (20) :'라고 쓰십시오. 'm'과 'b'와 같이 의미없는 한 글자 이름을 사용하면서 일관성이없고 비표준 간격을 사용하면 코드를 읽기가 훨씬 어려워집니다. – abarnert
또한 'ffmpeg'(끝에있는 변환을 위해서나 실제 스크린 샷을하기 위해)를 사용한다면, 도구로 포격하는 대신 ffmpeg/libav * 주위에 파이썬 래퍼를 사용하는 것이 좋습니다. 또는 툴을 사용하고자한다면'os.system' 대신'subprocess'를 사용하는 것을 고려해야합니다 (예 : 에러 처리 가능). – abarnert