mardi 3 février 2015

Print image and record audio input

I am very green about programming but wish to learn and develop.


I want to write a simple application that will be useful in linguistic treatments - but at first it is simple demo.


The application is about to display image and record sound during projection. There are few variables - interval and image/sound/movie clip paths - taken from external txt file (for the beginning - later I would like to perform some creator with presaved configurations).


The config file now looks like:



10
path1
path2
...


The first line is about to input interval in seconds, next there are paths to images, sounds or movie clips (I tried with images for now).



#!/usr/bin/python
# main.py

import sys
from PyQt4 import QtGui, QtCore

from Tkinter import *
import numpy as np

import pyaudio
import wave

import time

from PIL import Image, ImageTk

import multiprocessing

import threading
from threading import Thread

master = Tk()

conf_file = open("conf.txt", "r") #open conf file read only
conf_lines = conf_file.readlines()
conf_file.close()

interwal = conf_lines[0] #interval value from conf.txt file
bodziec1 = conf_lines[1] #paths to stimulus file (img / audio / video)
bodziec2 = conf_lines[2]
bodziec3 = conf_lines[3]

CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100
RECORD_SECONDS = interwal #every stimulus has it's own audio record file for further work

timestr = time.strftime("%Y%m%d-%H%M%S") #filename is set to year / month / day - hour / minute / second for easier systematization

def nagrywanie(): #recording action - found somewhere in the all-knowing web
p = pyaudio.PyAudo()

stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK)

print("* nagrywanie") #info about record to start

frames = []

for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
data = stream.read(CHUNK)
frames.append(data)
print("* koniec nagrywania") #info about record to end

stream.stop_stream()
stream.close()
p.terminate()

wf = wave.open(timestr, 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(frames))

def bod1(): #stimulus 1st to display / play
image = Image.open(bodziec1)
photo = ImageTk.PhotoImage(image)

def bod2():
image = Image.open(bodziec2) #stimulus 2nd to display / play
photo = ImageTk.PhotoImage(image)

def bod3():
image = Image.open(bodziec3) #stimulus 3rd to display / play
photo = ImageTk.PhotoImage(image)

def odpal(): #attemption to run display and recording at the same time
Thread(target = bod1).start()
Thread(target = nagrywanie).start()

# Wait interwal for odpal #give impetus for time in first line of the conf.txt
time.sleep(interwal)

# Terminate odpal #stop giving impetus
bod1.terminate()

# Cleanup #?? this part is also copied from all-knowing internet
p.join()

b = Button(master, text="OK", command=odpal) #wanted the program to be easier for non-programmers to operate so few buttons are necessary
b.pack()

mainloop()


When asked few programmers about the code it is as simple as riding a bike, so I wanted to learn how to write it by myself.


I guess it is peace of cake for professionals - 1000s of thanks to these ones who want even to read this junk.


It takes a lot of time for me to understand and figure out the exact commends that is why I am asking politely about the help - not only for education but also for better diagnosis.


Excuse me for the language - English is not my native language.


Aucun commentaire:

Enregistrer un commentaire