diff options
author | Hung <zxiiro@gmail.com> | 2010-01-30 17:07:22 -0500 |
---|---|---|
committer | Hung <zxiiro@gmail.com> | 2010-01-30 17:07:22 -0500 |
commit | 6f814ea140109acd6ce9e08d8e47dcbc0e685298 (patch) | |
tree | 2667fafc725e49c20c795ab683635a9b7a46fd09 | |
parent | 356aae7f97e8ae0f45c2e891cd5bda2fa052141d (diff) | |
download | freeseer-6f814ea140109acd6ce9e08d8e47dcbc0e685298.tar.gz freeseer-6f814ea140109acd6ce9e08d8e47dcbc0e685298.tar.xz freeseer-6f814ea140109acd6ce9e08d8e47dcbc0e685298.zip |
Merge wasn't complete
-rw-r--r-- | freeseer-gui-gtk.py | 57 | ||||
-rwxr-xr-x | freeseer-gui-qt.py | 310 | ||||
-rwxr-xr-x | freeseer.py | 184 | ||||
-rwxr-xr-x | talks.txt | 2 |
4 files changed, 0 insertions, 553 deletions
diff --git a/freeseer-gui-gtk.py b/freeseer-gui-gtk.py deleted file mode 100644 index ea44126..0000000 --- a/freeseer-gui-gtk.py +++ /dev/null @@ -1,57 +0,0 @@ -#!/usr/bin/python - -# freeseer - vga/presentation capture software -# -# Copyright (C) 2010 Free and Open Source Software Learning Centre -# http://fosslc.org -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. - -# For support, questions, suggestions or any other inquiries, visit: -# the #fosslc channel on IRC (freenode.net) - -from freeseer import * -import sys, os -import pygtk, gtk - -class GTK_Main: - def __init__(self): - window = gtk.Window(gtk.WINDOW_TOPLEVEL) - window.set_title("FreeSeeR GTK GUI - example") - window.set_default_size(480,320) - window.connect("destroy", gtk.main_quit, "WM destroy") - vbox = gtk.VBox() - window.add(vbox) - self.button = gtk.Button("Record") - self.button.connect("clicked", self.record) - vbox.add(self.button) - self.videosrc_list = gtk.combo_box_new_text() - self.videosrc_list.append_text('v4lsrc') - self.videosrc_list.append_text('v4l2src') - vbox.add(self.videosrc_list) - self.videobox = gtk.DrawingArea() - vbox.add(self.videobox) - window.show_all() - - self.freeseer = FreeSeeR() - self.freeseer.enable_preview(self.videobox.window.xid) - - def record(self, w): - self.freeseer.change_videosrc(self.videosrc_list.get_active_text(), '/dev/video0') - self.freeseer.record('default.mkv') - -GTK_Main() -gtk.gdk.threads_init() -gtk.main() - diff --git a/freeseer-gui-qt.py b/freeseer-gui-qt.py deleted file mode 100755 index 60e57d0..0000000 --- a/freeseer-gui-qt.py +++ /dev/null @@ -1,310 +0,0 @@ -#!/usr/bin/python - -# freeseer - vga/presentation capture software -# -# Copyright (C) 2010 Free and Open Source Software Learning Centre -# http://fosslc.org -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. - -# For support, questions, suggestions or any other inquiries, visit: -# the #fosslc channel on IRC (freenode.net) - -NAME = "freeseer" -VERSION = "playground" - -from freeseer import * -import os, sys, time, alsaaudio, audioop -from PyQt4 import QtGui, QtCore - -CONFIG = dict() - -# Initialize some defaults -PWD = os.getcwd() -TALKSFILE = sys.path[0] + '/talks.txt' -CONFIG['FILENAME'] = 'default.mkv' -CONFIG['FILE_INDEX'] = 0 -CONFIG['VODEVICE'] = '/dev/video0' -CONFIG['VODRIVER'] = 'v4l2src' - -# Find video devices -viddevs=0 -dev='/dev/video' + str(viddevs) -while QtCore.QFile.exists(dev): - print 'Video device ' + str(viddevs) + ' found.' - viddevs=viddevs+1 - dev='/dev/video'+str(viddevs) -print 'Found ' + str(viddevs) + ' video devices.' - -########################################### -# -# Widget to hold GST Player window instance -# -########################################### -class GSTPlayerWidget(QtGui.QWidget): - - def __init__(self, parent): - QtGui.QWidget.__init__(self, parent) - self.freeseer = FreeSeeR() - self.change_videosrc() - self.freeseer.enable_preview(self.winId()) - - def change_videosrc(self): - self.freeseer.change_videosrc(str(CONFIG['VODRIVER']), str(CONFIG['VODEVICE'])) - - def record(self): - self.freeseer.record(str(CONFIG['FILENAME'])) - - def stop(self): - self.freeseer.stop() - -class volcheck(QtCore.QThread): - def __init__(self, parent): - QtCore.QThread.__init__(self, parent) - self.parent = parent - - def run(self): - self.run = True - inp = alsaaudio.PCM(alsaaudio.PCM_CAPTURE, alsaaudio.PCM_NONBLOCK) - inp.setchannels(2) - inp.setrate(8000) - inp.setformat(alsaaudio.PCM_FORMAT_S16_LE) - - inp.setperiodsize(160) - - while self.run: - l,data = inp.read() - if l: - #print audioop.max(data, 2) - self.parent.volume.setValue(audioop.max(data, 2)) - time.sleep(.001) - -class EditTalks(QtGui.QWidget): - def __init__(self, parent=None): - QtGui.QWidget.__init__(self, parent) - - # Layout - layout = QtGui.QHBoxLayout() - - leftside = QtGui.QVBoxLayout() - self.editBox = QtGui.QLineEdit() - leftside.addWidget(self.editBox) - - self.talkList = QtGui.QListWidget() - leftside.addWidget(self.talkList) - - rightside = QtGui.QVBoxLayout() - self.addTalkButton = QtGui.QPushButton('add') - rightside.addWidget(self.addTalkButton) - self.delTalkButton = QtGui.QPushButton('remove') - rightside.addWidget(self.delTalkButton) - self.savTalkButton = QtGui.QPushButton('save') - rightside.addWidget(self.savTalkButton) - - layout.addLayout(leftside) - layout.addLayout(rightside) - self.setLayout(layout) - # End Layout - - # Connections - self.connect(self.addTalkButton, QtCore.SIGNAL('clicked()'), self.addTalk) - self.connect(self.delTalkButton, QtCore.SIGNAL('clicked()'), self.delTalk) - self.connect(self.savTalkButton, QtCore.SIGNAL('clicked()'), self.saveTalks) - - # Add talks - file = QtCore.QFile(TALKSFILE) - file.open(QtCore.QIODevice.ReadOnly) - - txtStream = QtCore.QTextStream(file) - while not txtStream.atEnd(): - text = txtStream.readLine() - self.talkList.addItem(text) - file.close() - - def addTalk(self): - self.talkList.addItem(self.editBox.text()) - - def delTalk(self): - self.talkList.takeItem(self.talkList.currentRow()) - - def saveTalks(self): - file = QtCore.QFile(TALKSFILE) - file.open(QtCore.QIODevice.WriteOnly) - - txtStream = QtCore.QTextStream(file) - i = 0 - while i < self.talkList.count(): - txtStream << self.talkList.item(i).text() << '\n' - i = i+1 - - txtStream.flush() - file.flush() - file.close() - -class MainApp(QtGui.QWidget): - - def __init__(self, parent=None): - QtGui.QWidget.__init__(self, parent) - - ############################# - # Begin Layout - ############################# - layout = QtGui.QVBoxLayout() - playerbox = QtGui.QHBoxLayout() - - self.record = QtGui.QPushButton("Record") - self.record.setCheckable(True) - layout.addWidget(self.record) - - videoLabel = QtGui.QLabel('Device:') - videoLabel.setMaximumWidth(50) - self.videoDevices = QtGui.QComboBox() - i = 0 - while i < viddevs: - self.videoDevices.addItem('/dev/video' + str(i)) - i=i+1 - self.videoDevices.addItem('/dev/fw1') - self.videoDrivers = QtGui.QComboBox() - self.videoDrivers.addItem('v4l2src') - self.videoDrivers.addItem('v4lsrc') - self.videoDrivers.addItem('dv1394src') - self.videoDrivers.addItem('ximagesrc') - viddevLayout = QtGui.QHBoxLayout() - viddevLayout.addWidget(videoLabel) - viddevLayout.addWidget(self.videoDevices) - viddevLayout.addWidget(self.videoDrivers) - layout.addLayout(viddevLayout) - - talkLabel = QtGui.QLabel('Title:') - talkLabel.setMaximumWidth(50) - self.talk = QtGui.QComboBox() - self.talk.addItem('Foo Bar - Test Presentation') - self.talkEditButton = QtGui.QPushButton("Edit") - self.talkEditButton.setMaximumWidth(50) - talkLayout = QtGui.QHBoxLayout() - talkLayout.addWidget(talkLabel) - talkLayout.addWidget(self.talk) - talkLayout.addWidget(self.talkEditButton) - layout.addLayout(talkLayout) - - self.playerWidget = GSTPlayerWidget(self) - playerbox.addWidget(self.playerWidget) - - self.volume = QtGui.QSlider(QtCore.Qt.Vertical, self) - self.volume.setFocusPolicy(QtCore.Qt.NoFocus) - self.volume.setRange(1, 32768) - playerbox.addWidget(self.volume) - - layout.addLayout(playerbox) - - self.logger = QtGui.QTextBrowser(self) - self.logger.setMaximumHeight(30) - layout.addWidget(self.logger) - - self.setLayout(layout) - ############################## - # End layout - ############################## - - # Connections - self.connect(self.record, QtCore.SIGNAL('toggled(bool)'), self.Capture) - self.connect(self.talkEditButton, QtCore.SIGNAL('clicked()'), self.editTalks) - self.connect(self.videoDevices, QtCore.SIGNAL('currentIndexChanged(int)'), self.changeVideoDevice) - self.connect(self.videoDrivers, QtCore.SIGNAL('currentIndexChanged(int)'), self.changeVideoDevice) - - self.volcheck = volcheck(self) - self.volcheck.start() - - # Add talks - file = QtCore.QFile(TALKSFILE) - file.open(QtCore.QIODevice.ReadOnly) - - txtStream = QtCore.QTextStream(file) - while not txtStream.atEnd(): - text = txtStream.readLine() - self.talk.addItem(text) - file.close() - - def changeVideoDevice(self): - print 'Changing video devices' - self.playerWidget.stop() - CONFIG['VODEVICE'] = self.videoDevices.currentText() - CONFIG['VODRIVER'] = self.videoDrivers.currentText() - self.playerWidget.change_videosrc() - - def closeEvent(self, event): - print 'Exiting freeseer...' - self.volcheck.run = False - self.playerWidget.stop() - event.accept() - - def editTalks(self): - self.talkEdit = EditTalks() - self.talkEdit.show() - self.talkEdit.resize(480, 320) - - # Check capture status, sets filename, and begin capture. - def Capture(self): - - if not (self.record.isChecked()): - self.stopCapture() - return - - self.checkFileExists() - self.startCapture() - - # checks if a filename exists or not and increments index until it finds - # at filename that is not taken - def checkFileExists(self): - i = 0 - while True: - CONFIG['FILENAME'] = QtCore.QDate.currentDate().toString(QtCore.Qt.ISODate) + " " + self.talk.currentText() + " (" + str(i) + ").mkv" - rfile = QtCore.QFileInfo(CONFIG['FILENAME']) - - if (rfile.exists()): - i += 1 - print "File Exists. Incrementing index to " + str(i) - else: - break - - def startCapture(self): - self.playerWidget.record() - self.record.setText('Stop') - self.videoDevices.setEnabled(False) - self.videoDrivers.setEnabled(False) - self.talk.setEnabled(False) - print 'Started capture' - - def stopCapture(self): - self.record.setText('Record') - self.playerWidget.stop() - self.videoDevices.setEnabled(True) - self.videoDrivers.setEnabled(True) - self.talk.setEnabled(True) - print 'Stopped capture' - - - -####################### -# Program starts here # -####################### -gobject.threads_init() -app = QtGui.QApplication(sys.argv) - -widget = MainApp() -widget.show() -widget.resize(480, 320) - -sys.exit(app.exec_()) - diff --git a/freeseer.py b/freeseer.py deleted file mode 100755 index d88abba..0000000 --- a/freeseer.py +++ /dev/null @@ -1,184 +0,0 @@ -# freeseer - vga/presentation capture software -# -# Copyright (C) 2010 Free and Open Source Software Learning Centre -# http://fosslc.org -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. - -# For support, questions, suggestions or any other inquiries, visit: -# the #fosslc channel on IRC (freenode.net) - -import gobject, pygst -pygst.require("0.10") -import gst - -class FreeSeeR: - def __init__(self): - self.window_id = None - - self.viddrv = 'v4lsrc' - self.viddev = '/dev/video0' - self.filename = 'default.mkv' - self.video_codec = 'theoraenc' - self.audio_codec = 'vorbisenc' - - self.player = gst.Pipeline("player") - - # GST Video - self.vidsrc = gst.element_factory_make(self.viddrv, "vidsrc") - self.cspace = gst.element_factory_make("ffmpegcolorspace", "cspace") - self.vidtee = gst.element_factory_make("tee", "vidtee") - self.vidqueue1 = gst.element_factory_make("queue", "vidqueue1") - self.vidqueue2 = gst.element_factory_make("queue", "vidqueue2") - self.vidcodec = gst.element_factory_make(self.video_codec, "vidcodec") - self.vidsink = gst.element_factory_make("autovideosink", "vidsink") - - # GST Video Filtering - self.fvidrate = gst.element_factory_make("videorate", "fvidrate") - self.fvidrate_cap = gst.element_factory_make("capsfilter", "fvidrate_cap") - self.fvidrate_cap.set_property('caps', gst.caps_from_string('video/x-raw-yuv, framerate=25/1')) - self.fvidscale = gst.element_factory_make("videoscale", "fvidscale") - self.fvidscale_cap = gst.element_factory_make("capsfilter", "fvidscale_cap") - self.fvidscale_cap.set_property('caps', gst.caps_from_string('video/x-raw-yuv, width=720, height=480')) - self.fvidcspace = gst.element_factory_make("ffmpegcolorspace", "fvidcspace") - - - # GST Sound - self.sndsrc = gst.element_factory_make("alsasrc", "sndsrc") - self.sndtee = gst.element_factory_make("tee", "sndtee") - self.sndqueue1 = gst.element_factory_make("queue", "sndqueue1") - self.sndqueue2 = gst.element_factory_make("queue", "sndqueue2") - self.audioconvert = gst.element_factory_make("audioconvert", "audioconvert") - self.sndcodec = gst.element_factory_make(self.audio_codec, "sndcodec") - self.sndsink = gst.element_factory_make("autoaudiosink", "sndsink") - - # GST Muxer - self.mux = gst.element_factory_make("matroskamux", "mux") - self.filesink = gst.element_factory_make("filesink", "filesink") - self.filesink.set_property("location", 'default.mkv') - - # GST Add Components - self.player.add(self.vidsrc, self.cspace, self.vidtee, self.vidqueue1, self.vidcodec) - self.player.add(self.fvidrate, self.fvidrate_cap, self.fvidscale, self.fvidscale_cap, self.fvidcspace) - self.player.add(self.sndsrc, self.sndtee, self.sndqueue1, self.audioconvert, self.sndcodec) - self.player.add(self.mux, self.filesink) - - # GST Link Components - gst.element_link_many(self.vidsrc, self.cspace, self.fvidrate, self.fvidrate_cap, self.fvidscale, self.fvidscale_cap, self.fvidcspace, self.vidtee) - gst.element_link_many(self.vidtee, self.vidqueue1, self.vidcodec, self.mux) - gst.element_link_many(self.sndsrc, self.sndtee) - gst.element_link_many(self.sndtee, self.sndqueue1, self.audioconvert, self.sndcodec, self.mux) - gst.element_link_many(self.mux, self.filesink) - - bus = self.player.get_bus() - bus.add_signal_watch() - bus.enable_sync_message_emission() - bus.connect("message", self.on_message) - bus.connect("sync-message::element", self.on_sync_message) - - def on_message(self, bus, message): - t = message.type - if t == gst.MESSAGE_EOS: - self.player.set_state(gst.STATE_NULL) - elif t == gst.MESSAGE_ERROR: - err, debug = message.parse_error() - print "Error: %s" % err, debug - self.player.set_state(gst.STATE_NULL) - - def on_sync_message(self, bus, message): - if message.structure is None: - return - message_name = message.structure.get_name() - if message_name == "prepare-xwindow-id": - imagesink = message.src - imagesink.set_property("force-aspect-ratio", True) - imagesink.set_xwindow_id(self.window_id) - - def change_videosrc(self, new_source, new_device): - if (self.viddrv == 'dv1394src'): - self.player.remove(self.dv1394q1) - self.player.remove(self.dv1394q2) - self.player.remove(self.dv1394dvdemux) - self.player.remove(self.dv1394dvdec) - self.dv1394q1 = None - self.dv1394q2 = None - self.dv1394dvdemux = None - self.dv1394dvdec = None - - self.viddrv = new_source - self.viddev = new_device - self.player.remove(self.vidsrc) - self.vidsrc = gst.element_factory_make(self.viddrv, "vidsrc") - self.player.add(self.vidsrc) - - if (self.viddrv == 'v4lsrc'): - self.vidsrc.set_property("device", self.viddev) - elif (self.viddrv == 'v4l2src'): - self.vidsrc.set_property("device", self.viddev) - elif (self.viddrv == 'dv1394src'): - self.dv1394q1 = gst.element_factory_make("queue", "dv1394q1") - self.dv1394q2 = gst.element_factory_make("queue", "dv1394q2") - self.dv1394dvdemux = gst.element_factory_make("dvdemux", "dv1394dvdemux") - self.dv1394dvdec = gst.element_factory_make("dvdec", "dv1394dvdec") - self.player.add(self.dv1394q1, self.dv1394q2, self.dv1394dvdemux, self.dv1394dvdec) - gst.element_link_many(self.vidsrc, self.dv1394q1, self.dv1394dvdemux, self.dv1394q2, self.dv1394dvdec, self.cspace) - return - - gst.element_link_many(self.vidsrc, self.cspace) - - def record(self, filename): - self.filename = filename - self.filesink.set_property("location", self.filename) - self.player.set_state(gst.STATE_PLAYING) - - def stop(self): - self.player.set_state(gst.STATE_NULL) - - def change_video_codec(self, new_vcodec): - self.video_codec = new_vcodec - self.player.remove(self.vidcodec) - self.vidcodec = gst.element_factory_make(self.video_codec, "vidcodec") - self.player.add(self.vidcodec) - gst.element_link_many(self.vidqueue1, self.vidcodec, self.mux) - - def change_audio_codec(self, new_acodec): - self.audio_codec = new_acodec - self.player.remove(self.sndcodec) - self.sndcodec = gst.element_factory_make(self.audio_codec, "sndcodec") - self.player.add(self.sndcodec) - gst.element_link_many(self.audioconvert, self.sndcodec, self.mux) - - def change_muxer(self, new_mux): - self.muxer = new_mux - self.player.remove(self.mux) - self.mux = gst.element_factory_make(self.muxer, "mux") - self.player.add(self.mux) - gst.element_link_many(self.sndcodec, self.mux) - gst.element_link_many(self.vidcodec, self.mux) - gst.element_link_many(self.mux, self.filesink) - - def enable_preview(self, window_id): - self.window_id = window_id - self.player.add(self.vidqueue2, self.vidsink) - gst.element_link_many(self.vidtee, self.vidqueue2, self.vidsink) - - def disable_preview(self): - self.player.remove(self.vidqueue2, self.vidsink) - - def enable_audio_feedback(self): - self.player.add(self.sndqueue2, self.sndsink) - gst.element_link_many(self.sndtee, self.sndqueue2, self.sndsink) - - def disable_audio_feedback(self): - self.player.remove(self.sndqueue2, self.sndsink)
\ No newline at end of file diff --git a/talks.txt b/talks.txt deleted file mode 100755 index 5a70aa6..0000000 --- a/talks.txt +++ /dev/null @@ -1,2 +0,0 @@ -Thanh Ha - Intro to PyQt4 -Thanh Ha - Intro to freeseer |