Đó là một câu hỏi cũ nhưng tôi vẫn chưa tìm thấy nó ghi lại bất cứ nơi nào.
tôi thấy rằng sau đây làm việc trên một đoạn video chơi với GStreamer 1,0
import gi
import time
gi.require_version('Gst', '1.0')
from gi.repository import Gst
def get_frame():
caps = Gst.Caps('image/png')
pipeline = Gst.ElementFactory.make("playbin", "playbin")
pipeline.set_property('uri','file:///home/rolf/GWPE.mp4')
pipeline.set_state(Gst.State.PLAYING)
#Allow time for it to start
time.sleep(0.5)
# jump 30 seconds
seek_time = 30 * Gst.SECOND
pipeline.seek(1.0, Gst.Format.TIME,(Gst.SeekFlags.FLUSH | Gst.SeekFlags.ACCURATE),Gst.SeekType.SET, seek_time , Gst.SeekType.NONE, -1)
#Allow video to run to prove it's working, then take snapshot
time.sleep(1)
buffer = pipeline.emit('convert-sample', caps)
buff = buffer.get_buffer()
result, map = buff.map(Gst.MapFlags.READ)
if result:
data = map.data
pipeline.set_state(Gst.State.NULL)
return data
else:
return
if __name__ == '__main__':
Gst.init(None)
image = get_frame()
with open('frame.png', 'wb') as snapshot:
snapshot.write(image)
Mã nên chạy với cả python2 và Python3, tôi hy vọng nó sẽ giúp một ai đó.
Nguồn
2017-10-17 15:03:18
Lưu ý rằng "5 giây" có thể không hoạt động. Đối với nhiều phim thương mại, bạn sẽ chỉ nhận được phần giới thiệu/logo. Cố gắng tìm các khung màu đen (chúng cho biết các thay đổi cảnh) và sau đó tìm kiếm một vài giây vào cảnh. Cung cấp cho người dùng 4-5 người để tìm hình ảnh dễ nhận ra. –
Điều này dành cho các video cá nhân dài hơn 5 giây. Trong mọi trường hợp, con số 5 giây chỉ là tùy ý và vì lợi ích của ví dụ. Có thể là 2, 10 hoặc bất kỳ giá trị nào khác bên dưới, giả sử là 30 giây. –