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!
- 2189 megtekintés
Hozzászólások
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.
- A hozzászóláshoz be kell jelentkezni
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();
}
- A hozzászóláshoz be kell jelentkezni
Ö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.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
Van dbus is meg mediacontrolapi is.
- A hozzászóláshoz be kell jelentkezni
Megnézem közelebbről a dbus-t is és az api-t is. Köszi!
- A hozzászóláshoz be kell jelentkezni
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;
}
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
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...
- A hozzászóláshoz be kell jelentkezni
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. :)
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni