CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Podgłaszanie dźwięku i niechciana zmiana balansu

Podgłaszanie dźwięku i niechciana zmiana balansu

problemy z tworzeniem aplikacji graficznych oraz audio i wideo

Podgłaszanie dźwięku i niechciana zmiana balansu

Nowy postprzez ludwik07 » piątek, 4 marca 2011, 12:54

Witam :) jestem początkującym jeśli chodzi o programowanie i chciałem zrobić sobie jakiś prosty odtwarzacz. Wszystko ładnie w nim śmiga oprócz podgłaszania. Gdy przesuwam TrackBarem to owszem zmienia się głośność dźwięku ale również balans przeskakuje mi na prawą słuchawkę. Wszystko w programie robiłem z różnych poradników zamieszczonych na internecie i między innymi ze skryptu Cyfrowego Barona, a oto kod:

KOD cpp:     UKRYJ  
//---------------------------------------------------------------------------

#include <vcl.h>
#include <vfw.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  OpenDialog1->Execute();
  if (OpenDialog1->FileName!="")
  {
    MediaPlayer1->FileName=OpenDialog1->FileName;
    MediaPlayer1->Open();

    Form1->Caption="Odtwarzacz multimedialny: "+ExtractFileName(OpenDialog1->FileName);
    TrackBar2->Max=MediaPlayer1->Length;
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
  Application->Terminate();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TrackBar1Change(TObject *Sender)
{
  waveOutSetVolume(0, (TrackBar1->Position*65535)+TrackBar1->Position);

  int wartosc, procent;
  String wynik;
  wartosc=(TrackBar1->Position);
  procent=(wartosc*10000)/65535;

  if(procent!=10000)
  {
    if(procent!=0)
    {
      wynik=FormatCurr("Dzwiek: #%", (procent/100));
    }
    else
    {
      wynik="Dzwiek: 0%";
    }
  }
  else
  {
    wynik="Dzwiek: 100%";
  }

  TrackBar1->ShowHint=TRUE;
  TrackBar1->Hint=wynik;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TrackBar2Change(TObject *Sender)
{
  TrackBar2->Position=MediaPlayer1->Position;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  TrackBar2->Position=MediaPlayer1->Position;

  bool odswiezanie;
  odswiezanie=TRUE;

  if(!odswiezanie)
  {
    TrackBar2->Refresh();
  }
  else
  {
    odswiezanie=FALSE;
  }
}
//---------------------------------------------------------------------------


I jeszcze pytań parę. Niektóre filmy odtwarzane tym programikem działają poprawnie a niektóre nie, czy to wina braku jakichś kodeków w programie i jak je można dodać do programu? I czy da radę ustawić TrackBar2 w ten sposób, że gdy go przesuwam to przesuwa się również miejsce odtwarzania pliku?
Avatar użytkownika
ludwik07
Bladawiec
Bladawiec
 
Posty: 14
Dołączył(a): piątek, 4 marca 2011, 12:22
Lokalizacja: Łódź
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows XP HE SP3
Kompilator: C++ Builder 6
Gadu Gadu: 6081312
    Windows XPOpera

Re: Podgłaszanie dźwięku i niechciana zmiana balansu

Nowy postprzez Cyfrowy Baron » piątek, 4 marca 2011, 13:12

Co się tyczy regulacji dźwięku, to zajrzyj do serwisu Cyfrowy Baron, dział: porady -> audio - wideo -> Mixer - regulacja sterowników dźwięku.
Co się zaś tyczy twojego kodu, to by to działało płynnie, to TrackBar1 musi mieć wartość Max ustawioną na 65535.



ludwik07 napisał(a):Niektóre filmy odtwarzane tym programikem działają poprawnie a niektóre nie, czy to wina braku jakichś kodeków w programie i jak je można dodać do programu?


To wina kontrolki TMediaPlayer, która bazuje na odtwarzaczu Windows Media Player i w zasadzie powinna odtwarzać to samo co ten odtwarzacz. Jeżeli u Ciebie tak nie jest to z winy środowiska C++Builder 6, które ma przestarzałą kontrolkę w stosunku do WMP. W C++Builder 2010 ten problem np. nie występuje.



ludwik07 napisał(a):I czy da radę ustawić TrackBar2 w ten sposób, że gdy go przesuwam to przesuwa się również miejsce odtwarzania pliku?


Skorzystaj z właściwości Position:

KOD cpp:     UKRYJ  
MediaPlayer1->Position = /* pozycja pliku nie więcej niż MediaPlayer1->Length */

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
ludwik07
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Podgłaszanie dźwięku i niechciana zmiana balansu

Nowy postprzez Cyfrowy Baron » piątek, 4 marca 2011, 13:18

Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Podgłaszanie dźwięku i niechciana zmiana balansu

Nowy postprzez ludwik07 » piątek, 4 marca 2011, 14:46

Dzięki wielkie za odpowiedź. Co prawda niezbyt rozumiem co się dzieje w kodzie miksera ale podgłaszanie działa już poprawnie. A i nie wiem czemu ale ten kod jakimś cudem gryzł się z komendą Application->Terminate(); i przy zamykaniu wywalało błędy, musiałem zmienić to na Close();

A z tym Position co do TrackBar2 to coś pokombinuje, narazie mi nie działa ale może uda mi się coś z tym zrobić :)

edit:
Aaa, zapomniałem się jeszcze o coś zapytać, w tym komponencie TMediaPlayer jest przycisk Stop, czy ten przycisk ma działać jak przycisk Pause? Czy tylko u mnie tak jest?
Avatar użytkownika
ludwik07
Bladawiec
Bladawiec
 
Posty: 14
Dołączył(a): piątek, 4 marca 2011, 12:22
Lokalizacja: Łódź
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows XP HE SP3
Kompilator: C++ Builder 6
Gadu Gadu: 6081312
    Windows XPOpera

Re: Podgłaszanie dźwięku i niechciana zmiana balansu

Nowy postprzez Cyfrowy Baron » sobota, 5 marca 2011, 18:19

ludwik07 napisał(a):Aaa, zapomniałem się jeszcze o coś zapytać, w tym komponencie TMediaPlayer jest przycisk Stop, czy ten przycisk ma działać jak przycisk Pause? Czy tylko u mnie tak jest?


Stop zatrzymuje odtwarzanie, jednak nie przewija pliku do początku stąd zachowanie jak w przypadku Pause.

Przyjrzałem się kontrolce TMediaPlayer i mogę z pełną odpowiedzialnością stwierdzić, że z w3ykorzystaniem tej kontrolki nie zbudujesz funkcjonalnego odtwarzacza plików audio i video, gdyż występ[uje problem z kodekami. Kontrolka po prostu nie podłącza niektórych kodeków automatycznie. Powinieneś poszukać w sieci jakiejś bogatszej biblioteki.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
ludwik07
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Podgłaszanie dźwięku i niechciana zmiana balansu

Nowy postprzez ludwik07 » sobota, 5 marca 2011, 18:48

Ok, jeszcze raz wielkie dzięki :) ale póki się uczę obsługiwać BCB i jego komend to zostanę przy tym co oferuje program. Ale oczywiście w końcu kiedyś zacznę korzystać z niestandardowych bibliotek :)
Avatar użytkownika
ludwik07
Bladawiec
Bladawiec
 
Posty: 14
Dołączył(a): piątek, 4 marca 2011, 12:22
Lokalizacja: Łódź
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows XP HE SP3
Kompilator: C++ Builder 6
Gadu Gadu: 6081312
    Windows XPOpera

Re: Podgłaszanie dźwięku i niechciana zmiana balansu

Nowy postprzez ludwik07 » wtorek, 8 marca 2011, 14:29

Temat jeszcze jest otwarty to ja w takim bądź razie chciałbym się jeszcze o coś zapytać bo niestety ale nie mogę dać sobie rady :roll:

Otóż zrobiłem sobię Playlistę do tego odtwarzacza mniejwiecej tak jak się doczytałem na forum (czyli za pomocą ListBox) i teraz głowię się nad tym, żeby MediaPlayer odtwarzał wszystkie utwory z Playlisty pokolei. Zapewne trzeba tutaj zrobić pętlę ale nie mam zielonego pojęcia co wpisać żeby po skończeniu odtwarzania 1 pozycji z Indexu zaczął odtwarzać drugą i tak dopóki nie skończą się wpisy.

I jeszcze prosiłbym o ciut więcej podpowiedzi co do tego (ponieważ nie mogętego rozgryźć :?)
Cyfrowy Baron napisał(a):
ludwik07 napisał(a):I czy da radę ustawić TrackBar2 w ten sposób, że gdy go przesuwam to przesuwa się również miejsce odtwarzania pliku?


Skorzystaj z właściwości Position:

KOD cpp:     UKRYJ  
MediaPlayer1->Position = /* pozycja pliku nie więcej niż MediaPlayer1->Length */
Avatar użytkownika
ludwik07
Bladawiec
Bladawiec
 
Posty: 14
Dołączył(a): piątek, 4 marca 2011, 12:22
Lokalizacja: Łódź
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows XP HE SP3
Kompilator: C++ Builder 6
Gadu Gadu: 6081312
    Windows XPOpera

Re: Podgłaszanie dźwięku i niechciana zmiana balansu

Nowy postprzez Cyfrowy Baron » wtorek, 8 marca 2011, 15:50

Co do pierwszego problemu, to w przykładzie z serwisu Cyfrowy Baron masz to w tym kodzie:

KOD cpp:     UKRYJ  
void __fastcall TForm1::PlayFile(int index)
{
MediaPlayer1->FileName = Lista->Strings[index];
MediaPlayer1->Open();

Timer1->Enabled = true;
ProgressBar1->Max = MediaPlayer1->Length;

MediaPlayer1->Play();
Edit1->Text = ListBox1->Items->Strings[index] + FullTime();
}
//--------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
ProgressBar1->Position = MediaPlayer1->Position;
if(ProgressBar1->Position == MediaPlayer1->Length){
    Timer1->Enabled = false;
    if(ListBox1->ItemIndex < ListBox1->Items->Count - 1)
      ListBox1->ItemIndex = ListBox1->ItemIndex + 1;
    else ListBox1->ItemIndex = 0;
      MediaPlayer1->Close();
      PlayFile(ListBox1->ItemIndex);
              }
}


Zamiast Timer'a można użyć zdarzenia OnIddle dla aplikacji, przykład w tym poście http://programowanie.cal.pl/forum/viewtopic.php?f=2&t=1137&p=7820&hili#p7820

Można też wykorzystać zdarzenie OnNotify obiektu MediaPlayer1, które jest wywoływane metody Back, Close, Eject, Next, Open, Pause, PauseOnly, Play, Previous, Resume, Rewind, StartRecording, Step, or Stop.

KOD cpp:     UKRYJ  
void __fastcall TForm1::MediaPlay(String FileName)
{
 MediaPlayer1->FileName = FileName;

 MediaPlayer1->Open();
 MediaPlayer1->Play();

}
//---------------------------------------------------------------------------
void __fastcall TForm1::MediaPlayer1Notify(TObject *Sender)
{
 if(ListBox1->ItemIndex == -1) ListBox1->ItemIndex = 0;
 else ListBox1->ItemIndex += 1;

 MediaPlay(ListBox1->Items->Strings[ListBox1->ItemIndex]);
}





Co się tyczy drugiego problemu to czas określasz w milisekundach, czyli sekundy * 1000. Nie jest to jednak zbyt precyzyjne jak zauważyłem, gdyż nie zawsze czas odtwarzania odpowiada czasowi zadanemu (zmienionej pozycji). Znacznie lepszym rozwiązaniem jest określenie pozycji względem całej długości odtwarzanego pliku:

Bezpośrednie podanie czasu odtwarzania:
KOD cpp:     UKRYJ  
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 MediaPlayer1->TimeFormat = tfMilliseconds;

 /* teoretycznie 20 sekund, w praktyce zależy od rodzaju odtwarzanego pliku */
 MediaPlayer1->Position =  20000;

 /* po przesunięciu trzeba ponownie wywołać Play() */
 MediaPlayer1->Play();
}


Względne przesuwanie z wykorzystaniem TrackBar, przy czym Max należy ustawić na MediaPlayer1->Length:
KOD cpp:     UKRYJ  
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 MediaPlayer1->Open();

 MediaPlayer1->TimeFormat = tfMilliseconds;
 TrackBar1->Max = MediaPlayer1->Length;

 MediaPlayer1->Play();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TrackBar1Change(TObject *Sender)
{
 MediaPlayer1->Position = TrackBar1->Position;
}
 

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
ludwik07
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Podgłaszanie dźwięku i niechciana zmiana balansu

Nowy postprzez ludwik07 » wtorek, 8 marca 2011, 16:59

Dobra, dzięki, później pokombinuję nad tym (nie wiem czy mi to wyjdzie bo ja mam program rozbity na 3 Form z czego na jednej jest MediaPlayer a na drugiej PlayLista) bo spalił mi się zasilacz od monitora a aktualnie jestem podłączony do TV i muszę się już odłączyć :/


edit:
Zasilacz już naprawiony ;D i przeskok na PlayLiscie też już działa ^^, jeszcze tylko dodam sobie to przesuwanie piosenki (ale to już chyba jutro ;)) i to by było na tyle z tym programem :)

Jeszcze raz wielkie dzięki za okazaną pomoc :) myślę, że można już zamknąć temat.
Avatar użytkownika
ludwik07
Bladawiec
Bladawiec
 
Posty: 14
Dołączył(a): piątek, 4 marca 2011, 12:22
Lokalizacja: Łódź
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows XP HE SP3
Kompilator: C++ Builder 6
Gadu Gadu: 6081312
    Windows XPOpera

Re: Podgłaszanie dźwięku i niechciana zmiana balansu

Nowy postprzez Cyfrowy Baron » sobota, 12 marca 2011, 15:09

Zapoznaj się z tym wątkiem http://programowanie.cal.pl/forum/viewtopic.php?f=5&t=1306&p=9469#p9462, a nie będziesz musiał męczyć się z TMediaPlayer.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
ludwik07
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Aplikacje multimedialne, graficzne

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 0 gości

cron