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

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

Nowy postNapisane: piątek, 4 marca 2011, 12:54
przez ludwik07
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?

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

Nowy postNapisane: piątek, 4 marca 2011, 13:12
przez Cyfrowy Baron
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 */

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

Nowy postNapisane: piątek, 4 marca 2011, 13:18
przez Cyfrowy Baron

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

Nowy postNapisane: piątek, 4 marca 2011, 14:46
przez ludwik07
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?

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

Nowy postNapisane: sobota, 5 marca 2011, 18:19
przez Cyfrowy Baron
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.

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

Nowy postNapisane: sobota, 5 marca 2011, 18:48
przez ludwik07
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 :)

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

Nowy postNapisane: wtorek, 8 marca 2011, 14:29
przez ludwik07
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 */

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

Nowy postNapisane: wtorek, 8 marca 2011, 15:50
przez Cyfrowy Baron
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;
}
 

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

Nowy postNapisane: wtorek, 8 marca 2011, 16:59
przez ludwik07
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.

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

Nowy postNapisane: sobota, 12 marca 2011, 15:09
przez Cyfrowy Baron
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.