» 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í, Nahrávka



Samsung půjde ve šlépějích Huawei a Applu. Řada Galaxy S23 má dostat vysokorychlostní satelitní konektivitu

Samsung půjde ve šlépějích Huawei a Applu. Řada Galaxy S23 má dostat vysokorychlostní satelitní konektivitu

** Po Huawei a Applu přišla řada i na Samsung ** Řada Galaxy S23 má podporovat satelitní komunikaci ** Samsung spolupracuje s firmou Iridium, a má globální cíle

Martin Chroust
SatelitGalaxy
Konec českého poskytovatele internetu v přímém přenosu. Připomíná to krachující energetické firmy
Lukáš Václavík
CETINPoskytovatelé internetuPřipojení k internetu
Google není jen vyhledávač: 15 užitečných funkcí, o kterých možná ani nevíte

Google není jen vyhledávač: 15 užitečných funkcí, o kterých možná ani nevíte

** Google umí kromě vyhledávání i spoustu dalších věcí ** Vybrali jsme více než 15 užitečných funkcí a schopností ** Stačí zadat do vyhledávače ta správná klíčová slova

Karel Kilián
TipyVyhledávačeGoogle
Za WhatsApp se bude platit! Za předplatné dostanete funkci, která je u konkurence zadarmo

Za WhatsApp se bude platit! Za předplatné dostanete funkci, která je u konkurence zadarmo

** Bylo to jen otázkou času ** Už i WhatsApp nabízí prémiové předplatné ** Za poplatek dostanete funkci, která je u konkurence zadarmo

Martin Chroust
předplatnéWhatsAppMobilní aplikace
Tuto českou základnu plnou satelitů nesmíte vidět. V Mapy.cz je každá anténa pečlivě vyretušovaná

Tuto českou základnu plnou satelitů nesmíte vidět. V Mapy.cz je každá anténa pečlivě vyretušovaná

** Zapomeňte na rozčtverečkovaná místa, kterých si každý všimne ** Mapy.cz musely dokonale zakrýt desítky parabol ** Základnou se přitom na webu chlubí i její majitel. Kocourkov

Jakub Čížek
ČeskoMapy.czMapy
Facebook má nejspíš vaše telefonní číslo, i když jste mu ho nikdy nedali. Tímto tajným nástrojem ho můžete smazat

Facebook má nejspíš vaše telefonní číslo, i když jste mu ho nikdy nedali. Tímto tajným nástrojem ho můžete smazat

**Meta poskytuje nástroj na vymazání telefonních čísel a e-mailových adres z Facebooku a Instagramu **V minulosti Mark Zuckebrg popřel, že by Facebook vytvářel stínové profily **Metě teď můžete sebrat klíčové iddentifikátory, pořád o vás ale nejspíš ví mnoho dalšího

Petr Urban
MetaSledováníSociální sítě
Recenze hry Mario + Rabbids: Sparks of Hope. Na pohled jednoduchá tahovka, která nabízí spoustu možností

Recenze hry Mario + Rabbids: Sparks of Hope. Na pohled jednoduchá tahovka, která nabízí spoustu možností

Ubisoft podruhé dostal do rukou licenci na Maria, kterou opět zkombinoval s šílenými králíky. Jak se vydařilo pokračování jejich tahové strategie? 

Martin Nahodil
Mario + Rabbids: Sparks of HopeNintendo SwitchRecenze
Elektromagnetické pušky jsou postrachem dronů ve válce. Vypadají jako ze sci-fi

Elektromagnetické pušky jsou postrachem dronů ve válce. Vypadají jako ze sci-fi

** Ukrajinské síly používají několik typů lehkých protidronových pušek ** Na fotografiích z bojů se nejčastěji vyskytují EDM4S a KVS G-56 ** Malý dron „sestřelí“ na vzdálenost až několika kilometrů

Jakub Čížek
UkrajinaZbraněUAVDrony
Vyzkoušeli jsme levnou autodiagnostiku s Androidem. Servisy ohrnou nos, řidičům bude stačit

Vyzkoušeli jsme levnou autodiagnostiku s Androidem. Servisy ohrnou nos, řidičům bude stačit

** Smartphone s Androidem dnes využijete i pro autodiagnostiku ** Jednotku OBD-II dnes pořídíte za pár stovek ** Co se vše dokáže diagnostika s bezplatným SW v češtině?

Martin Chroust
DiagnostikaPro řidiče

Aktuální číslo časopisu Computer

Megatest mobilů do 4 000 Kč

Velký test herních notebooků

Jak zkrotit sociální sítě

Vše o senzorech v hodinkách