» Poradna » Ostatní

Náhrávání zvuku + stopky v C#

 |   |  Microsoft Windows 7 Chrome 10.0.648.205

Zdar chlapi.
Sháním někoho, kdo by mi řekl, jestli je možné když nahrávám z mikrofonu v C#, kód viz níže, udělat i pomocí vlákna nějak stopky? Vůbec nevím jak na to. Půjde to vůbec?


using System;
using System.IO;
using System.Reflection;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.VisualBasic.Devices;
using Microsoft.VisualBasic;
using System.Runtime.InteropServices;



namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
//pro nahravani
[DllImport("winmm.dll", EntryPoint = "mciSendStringA", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
private static extern int mciSendString(string lpstrCommand, string lpstrReturnString, int uReturnLength, int hwndCallback);
//pro prehravac
[DllImport("winmm.dll")]
private static extern long mciSendString(string strCommand, StringBuilder strReturn, int iReturnLength, IntPtr hwndCallback);

public Form1()
{
InitializeComponent();
button4.Enabled = false;
button2.Enabled = false;
button3.Enabled = false;

//kontrola souboru LAME.EXE na C:\
FileInfo soubor = new FileInfo(Path.Combine(Environment.CurrentDirectory, "c:\\lame.exe"));
if (!soubor.Exists) //kdyz soubor lame.exe neexistuje zabraz zpravu
{
MessageBox.Show("Pro správnou funkci programu, prosím nakopírujte soubor \"LAME.EXE\" do kořenového adresáře C:\\ \n\nProgram se nyní ukončí."); //kontrola souboru LAME.EXE na disku C:\
System.Environment.Exit(0); //pokud se soubor LAME.EXE nenajde na disku, program se ukončí "killnutí procesu"
}
}
//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//nahrávání do wav
private void button1_Click(object sender, EventArgs e) //aktivace Ukázat celý příspěvek

Mohlo by vás také zajímat

Odpovědi na otázku

 |   |  Microsoft Windows 7 Chrome 10.0.648.205

Tak už se mi podařilo to, že když kliknu na tlačítko "Button_1 neboli NAHRAVANI a potom na tlačítko Button_2, tak se mi čas zobrazí v LABEL_4. Už jenom aby to tam prostě vepisoval během nahrávání. S tím jsem zatím v koncích.

Stopwatch stopky = new Stopwatch();
private void button1_Click(object sender, EventArgs e) //aktivace nahrávání z mikrofonu
{

stopky.Start();

mciSendString("open new Type waveaudio Alias recsound", "", 0, 0);
mciSendString("record recsound", "", 0, 0);
button2.Enabled = true;
}

private void button2_Click(object sender, EventArgs e) //zastaveni nahravani a ulozeni zalozniho souboru nahravka.wav
{
TimeSpan ts = stopky.Elapsed;
string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",ts.Hours, ts.Minutes, ts.Seconds,ts.Milliseconds / 10);
label4.Text = " " + elapsedTime;

mciSendString("save recsound c:\\nahravka.wav", "", 0, 0); //ulozeni nahravka.wav
mciSendString("close recsound ", "", 0, 0); //ukonceni souboru nahravka.wav
Computer c = new Computer();
c.Audio.Stop();
button3.Enabled = true;
button4.Enabled = true;
}

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 Firefox 3.6.16

V C# nedělám, ale řešil bych to jinak. 2x klikat není moc šťastné.
Při začátku nahrávání bych spustil timer (vlastnost Enabled na True), v něm bych cyklicky zjištoval pozici v nahrávaném wav (API fce waveInGetPosition) a hodnotu zapisoval do labelu. Ale aby se text v labelu aktualizoval, budeš asi muset obsloužit zprávy (v Delphi je to metoda ProcessMessages objektu TApplication)

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 Chrome 10.0.648.205

Tak stále se mi nedaří udělat to vlákno na ty stopky, tak aby se to zobrazovalo v tom LABEL_4. Nemá někdo nějakou rozumnou radu?

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 Firefox 3.6.16

Co chceš vědět? Principielně to bude v C# stejné.

1) Chceš zobrazovat čas nahrávání? Je blbost zapínat nahrávání jiným tlačítkem než stopky a měl bys v labelu přímo zobrazovat čas nahrávání (API (SDK) funkce waveInGetPosition, příp. waveOutGetPosition pro přehrávání)
2) Aby cyklicky běžel čas, měl by se text labelu měnit v eventu časovače (TTimer.OnTimer je to v Delphi), v tomto prostě zjistit pomocí toho waveInGetPosition pozici v nahrávce, číslo napsat do labelu (v Delphi je to vlastbost Caption) a volat metodu obsluhující ty "okenní" eventy (v Delphi je to TApplication.ProcessMessages), protože pokud zpracováváš jedno nějaké vlákno, tak během tohoto zpracovávání se ty zprávy neobslouží a vizuální vlastnosti okna se neaktualizují. Příp. můžeš aktualizovat jen ten jeden objekt (TLabel.Invalidate, Refresh nebo Reoaint, už nevím)

Popisuju ti princip, který mi funguje při přehrávání a real-time zpracovávání a zvuku a real-time grafickém zobrazení výsledku zpracování toho zvuku. Je to v Delphi, ale na C# u6 si to musíš napasovat sám, princip určitě zůstane.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 Firefox 3.6.16

Prostě hledej v C# objekt (komponentu) Timer (časovač), v něm se zabávej zjištěním pozice v nahrávce (waveInGetPosition) a přepisováním textu toho labelu, a příp. obsloužením těch zpráv, které tečou do aplikace.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 Chrome 10.0.648.205

OK. Zkusím. Dík za postup.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 Chrome 10.0.648.205

Tak jsem si zkusil vložit vlákno co jsme dělali ve škole do mého programu a zkoumat jak se to bude chovat. Bo za zkoušku nic nedám. Snažil jsem se vložit tam takové vlákno, které bude v konzoli vypisovat vlakno1 a vlakno2 a myslel jsem, že to bude vypisovat v konzoli a k tomu ještě nahrávat. Ale opak byl pravdou. Nevíte jak to upravit, aby to vypisovalo a nahrávalo? Nebo je to úplná kravina to co jsem udělal? Díkes


using System;
using System.IO;
using System.Reflection;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.VisualBasic.Devices;
using Microsoft.VisualBasic;
using System.Runtime.InteropServices;
using System.Threading;
using System.Timers;
using System.Diagnostics;



namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public void Start()
{
new Thread(new ThreadStart(ProcessTimer)).Start();
}
private void ProcessTimer()
{
DateTime Now = DateTime.Now;

TimeSpan ts = stopky.Elapsed;
string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10);
label4.Text = " " + elapsedTime;
}





//pro nahravani
[DllImport("winmm.dll", EntryPoint = "mciSendStringA", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
private static extern int mciSendString(string lpstrCommand, string lpstrReturnString, int uReturnLength, int hwndCallback);
//pro prehravac
[DllImport("winmm.dll")]
private static extern long mciSendString(string strCommand, StringBuilder strReturn, int iReturnLength, IntPtr hwndCallback);

public Form1()
{
InitializeComponent();
button4.Enabled = false;
button2.Enabled = false;
button3.Enabled = false;
label4.Text = " ";

//kontrola souboru LAME.EXE na C:\
FileInfo soubor = new FileInfo(Path.Combine(Environment.CurrentDirectory, "c:\\lame.exe"));
 Ukázat celý příspěvek

Souhlasím  |  Nesouhlasím  |  Odpovědět
 | Microsoft Windows 7 Mozilla 1.9.2.15

To co hledáš se obecně jmenuje INVOKE, ale zatím s tím nemáš zkušenosti a vysvětlování by bylo na dýl.
Tak si to vygoogli v nějakém tématu, který o tom pojednává.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 | Microsoft Windows 7 Mozilla 1.9.2.15

Obecně by mělo pomoci něco takového:


//Tuto funkci nastavíš timeru
private void _CrossThreadSetText(string strNew)
{
//Tímto definuješ funkci, která se má volat z GUI vlákna
Invoke(new SetTextDelegate(_SetText), new object[] { strNew });
}

// Tato funkce se "invokne" do GUI vlákna
private void _SetText(string strNew)
{
label1.Text = strNew;
}

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 Chrome 10.0.648.205

Tak se mi podařilo nějakým zázračným způsobem trošku to rozjet. TeĎ mi to dělá, že když nahrávám, tak mi to zobrazuje systémový čas. Ale už fakt nevím jak udělat, aby mi to pouze stopovalo a zobrazovalo jako formát 00:00:00.

namespace WindowsFormsApplication1
{

public partial class Form1 : Form
{

//pro nahravani
[DllImport("winmm.dll", EntryPoint = "mciSendStringA", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
private static extern int mciSendString(string lpstrCommand, string lpstrReturnString, int uReturnLength, int hwndCallback);
//pro prehravac
[DllImport("winmm.dll")]
private static extern long mciSendString(string strCommand, StringBuilder strReturn, int iReturnLength, IntPtr hwndCallback);


DispatcherTimer _timer;


public Form1()
{
InitializeComponent();
button4.Enabled = false;
button2.Enabled = false;
button3.Enabled = false;
label4.Text = " ";

//kontrola souboru LAME.EXE na C:\
FileInfo soubor = new FileInfo(Path.Combine(Environment.CurrentDirectory, "c:\\lame.exe"));
if (!soubor.Exists) //kdyz soubor lame.exe neexistuje zabraz zpravu
{
MessageBox.Show("Pro správnou funkci programu, prosím nakopírujte soubor \"LAME.EXE\" do kořenového adresáře C:\\ \n\nProgram se nyní ukončí."); //kontrola souboru LAME.EXE na disku C:\
System.Environment.Exit(0); //pokud se soubor LAME.EXE nenajde na disku, program se ukončí "killnutí procesu"
}


_timer = new DispatcherTimer();
_timer.Tick += new EventHandler(delegate(object s, EventArgs a)
{
label4.Text = " " + DateTime.Now.TimeOfDay; //upravit=====upravit====upravit

});
}
//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//nahrávání do wav

private void button1_Click(object sender, EventArgs e) //aktivace nahrávání z mikrofonu
{
// Start the timer

 Ukázat celý příspěvek

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 Chrome 10.0.648.205

Tak už i toto se mi podařilo opravit. Ale nevíte někdo, čím by to mohlo být, že mi ty čísla přeskakují pouze, když hýbu myší? Pro jistotu sem přidám celý zdrojový kód.





using System;
using System.IO;
using System.Reflection;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.VisualBasic.Devices;
using Microsoft.VisualBasic;
using System.Runtime.InteropServices;
using System.Threading;
using System.Timers;
using System.Diagnostics;
using System.Windows.Threading;


namespace WindowsFormsApplication1
{

public partial class Form1 : Form
{

//pro nahravani
[DllImport("winmm.dll", EntryPoint = "mciSendStringA", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
private static extern int mciSendString(string lpstrCommand, string lpstrReturnString, int uReturnLength, int hwndCallback);
//pro prehravac
[DllImport("winmm.dll")]
private static extern long mciSendString(string strCommand, StringBuilder strReturn, int iReturnLength, IntPtr hwndCallback);


DispatcherTimer _timer;


public Form1()
{
InitializeComponent();
button4.Enabled = false;
button2.Enabled = false;
button3.Enabled = false;
label4.Text = " ";
label5.Text = " ";

//kontrola souboru LAME.EXE na C:\
FileInfo soubor = new FileInfo(Path.Combine(Environment.CurrentDirectory, "c:\\lame.exe"));
if (!soubor.Exists) //kdyz soubor lame.exe neexistuje zabraz zpravu
{
MessageBox.Show("Pro správnou funkci programu, prosím nakopírujte soubor \"LAME.EXE\" do kořenového adresáře C:\\ \n\nProgram se nyní ukončí."); //kontrola souboru LAME.EXE na disku C:\
System.Environment.Exit(0); //pokud se soubor LAME.EXE nenajde na disku, program se ukončí "killnutí procesu"
}


_timer = new DispatcherTimer();
_timer.Tick += new EventHandler(delegate(object s, EventArgs a)
{
//label4.Text = " Ukázat celý příspěvek

Souhlasím  |  Nesouhlasím  |  Odpovědět

Související témata: Stopky, Private, Void, False, NULL, Výstupní soubor, Dekódování