QProcess és VLC vezérlés

 ( landras | 2008. október 27., hétfő - 21:54 )

Hello!

Egy ideje már szenvedek a következő problémával, de nem tudom megoldani.

Egy olyan Qt-s programot írok, ami a VLC-vel kommunikál.

A probléma az, hogy QProcess-en keresztül nem tudom a vlc remote control interface-t elérni. Csak normál módban sikerült elindítani. Próbálkoztam sima QProcess-sel és Q3Process-sel is hasonló eredménnyel. Aztán megpróbáltam úgy is, hogy nem közvetlenül hívom meg, hanem először egy sh-t indítok interaktív módban és annak írok az stdin-jére egy parancsot, ami elindítja a vlc-t rc-ben de így sem ment, csak normál gui-s módban. Bash-sel és interaktív móddal hasonló eredmény. Aztán megpróbálkoztam egy xterm-es megoldással. Itt bár egy xterm -e vlc -I rc parancsot indítva qprocess-sel elindult az rc felület, de az xterm-nek nem tudok az stdin-jére írni. A parancs átadás után nem történik semmi. A cél az lenne, hogy qprocess-sel lehessen vlc-t remote control felületen vezérelni.

Tudtok valamit javasolni a probléma megoldására?

Előre is köszönöm a válaszokat!

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Esetleg kódot lehetne látni, hogy hogyan hívod meg a VLC-t QProcess eljárásokkal?

--
A gyors gondolat többet ér, mint a gyors mozdulat.

Ebben több változat is van, kommenteztem, hogy melyiket mire használtam.

(...)

int main(int argc, char* argv[])
{
    QApplication app(argc,argv);
    Q3Process proc;
    
    //proc.setReadChannelMode(QProcess::MergedChannels);	//QProcess-hez
    //proc.setEnvironment(QProcess::systemEnvironment());	//QProcess-hez
    proc.setCommunication(Q3Process::Stdin);
    
    QStringList arg;
    //arg << "bash" << "-i";	//bash indításához argumentumok
//    arg << "xterm" << "-e" << "vlc" << "-I" << "rc";	//xterm-ess megoldáshoz	
    arg << "vlc" << "-I" << "rc";	//direkt vlc indítás
    
    proc.setArguments(arg);
    
    proc.start();
    
    QString s;
    QByteArray buf;
    
    s="add ~/ftp/Building_a_Basic_Approval_Workflow.wmv\n";
    buf=s.toUtf8();
    //proc.write(buf);
    proc.writeToStdin(buf);
    proc.closeStdin();
    
//    QString str(proc.readAll());
    
//    qDebug() << str;
    
    //proc.write("quit");

    return app.exec();
}

Összeütöttem egy gyors tesztprogramot, nálam sem működik. (Win)

nemWin alatt próbáld meg az args << "--rc-fake-tty"; sort beszúrni az args << "-Irc"; után, hátha...
--
A gyors gondolat többet ér, mint a gyors mozdulat.

Sajnos hasonló működést vált ki. Ráadásul, ha csak command-line így elindítom, nekem nem is reagál semmire. Még a kezelőfelületet sem tölti be.

Nincs ennek a stuffnak dbus felulete? Lehet azzal 1xubb lenne.
--

()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

Van dbus is meg mediacontrolapi is.

http://wiki.videolan.org/ExternalAPI

Megnézem közelebbről a dbus-t is és az api-t is. Köszi!

Nos, barátkozom a godot által javasolt mediacontrolapi-val.

Összedobtam egy tesztprogramot, de sajnos szegmens hibával elszáll.
A szegmens hibát a "mediacontrol_new_from_object" fgv hívásnál kapja. Az id-nek van értéke. Nem tudok rájönni, hogy mit csinálok rosszul. De volt hogy már eljutott a "mediacontrol_Position *end" -ig és utána mikor az end egyes tagjait akartam változtatni akkor szállt el szegmens hibával. Ha nincs mediacontrol a programban akkor simán elindul a vlc.

#include iostream
#include cstdlib
#include unistd.h
#include vlc/libvlc.h
#include vlc/mediacontrol.h

using namespace std;

static void quit_on_exception (libvlc_exception_t *excp) {
   if (libvlc_exception_raised (excp)) {
         fprintf(stderr, "error: %s\n", libvlc_exception_get_message(excp));
         exit(-1);
      }
}
		  
int main(int argc, char **argv) {
    libvlc_exception_t excp;
    mediacontrol_Exception *mexcp;
    mediacontrol_Instance *media;
    libvlc_instance_t *inst;
    int item;
    char *filename = "~/ftp/Building_a_Basic_Approval_Workflow.wmv";
		
    string a;
    
    cin >> a;
    
    if(a=="add")
    {
	//vlc instance létrehozása
	libvlc_exception_init (&excp);
	inst = libvlc_new (argc, argv, &excp);
	quit_on_exception (&excp);
	
	//mediacontrol a szöveg kiíratáshoz
	int id=libvlc_get_vlc_id(inst);
	cout << "dd : " <<  id << endl;
	media=mediacontrol_new_from_object(id,mexcp);
	cout << "dd";
	
	//playlist-hez hozzáadás
	item = libvlc_playlist_add (inst, filename, NULL, &excp); 
	quit_on_exception (&excp);
	
	//lejátszás
	libvlc_playlist_play (inst, item, 0, NULL, &excp); 
	quit_on_exception (&excp);
	
	//szöveg kiíratáshoz
	mediacontrol_PositionOrigin orig=mediacontrol_AbsolutePosition;
	mediacontrol_PositionKey key=mediacontrol_MediaTime;

	mediacontrol_Position *begin=NULL;
	begin->origin=orig; begin->key=key; begin->value=1000;
	cout << "dd";
	
	mediacontrol_Position *end=NULL;
	//end=begin; 
	end->origin=orig; end->key=key; end->value=100000;
	
	const char *str="ez is meg van";
	
	mediacontrol_display_text(media, str, begin, end, mexcp);
	sleep (10000000);
	libvlc_destroy (inst);
    }
    return 0;
}

Milyen leírás/tutorial alapján próbálkozol?

Mert itt én nem is látok olyat, hogy
"mediacontrol_new_from_object".
Elvileg egyébként a mediacontrol egy egyszerüsített api a libvlc felett, és nem kell libvlc_* hívásokkal keverni.

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o

Ezt a mediacontrol.h file-ban találtam. A doksi-ban mediacontrol_new_from_instance volt, csak a fejlesztők ezt kihagyták, vagy másik verzió.

Sikerült rájönnöm, hogy a szegmens hiba miért volt, & helyett *-ot használtam...

Már csak arra kellene rájönnöm, hogy hogyan lehet képet vagy szöveget rátenni a videóra. Ha ez megvan, akkor már teljes lesz a boldogságom. :)

Hat ha rendes subtitle, akkor ugy kell a fajlt megnyitni, hogy melle rakod a feliratot. Ha valami egyeni izet akarsz, akkor ujra kell enkodolnod a streamet runtime-ban, ami eleg eroforrasigenyes...
--

()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.