我想在我的应用程序中使用Video/ MediaPlayerQML元素,并让它从自定义流中播放视频.QMediaPlayer似乎支持这个,因为你可以告诉它从QIODevice哪个可以做任何你想做的事情.但MediaPlayer只支持URL.
有什么办法可以注册我自己使用自己的流媒体协议的URL方案吗?例如,说我想做rtsp2://...,我可以做一些模糊的事情:
class Rtsp2 : public QIODevice
{
// open, read, seek, close, etc.
}
QCoreApplication::registerUrlProtocol("rtsp2", Rtsp2);
Run Code Online (Sandbox Code Playgroud) 我正在构建一个GUI应用程序,我在其中进行系统调用并调用gnuplot来运行脚本.现在我想构建一个错误消息,说明什么时候出错(例如没有安装gnuplot或者路径错误).
所以我一直在考虑推出一个QMessageBox,但我不知道如何检查系统调用是否成功.
if(//System call didn't work)
{
QMessageBox msgBox;
msgBox.setWindowTitle("Error");
msgBox.setIcon(QMessageBox::Critical);
msgBox.setText("GNUPLOT was not installed");
msgBox.exec();
}
Run Code Online (Sandbox Code Playgroud)
我的系统调用如下所示:
system(gnuplot script.txt);
Run Code Online (Sandbox Code Playgroud)
有什么建议?
我正在寻找一种在QML中实现视频播放器应用程序的最佳方法.几乎所有QML示例都是从文件系统或Web读取文件:
MediaPlayer {
id: mediaplayer
source: "groovy_video.mp4"
}
VideoOutput {
anchors: parent.fill
source: mediaplayer
}
Run Code Online (Sandbox Code Playgroud)
我想指定我自己的源MediaPlayer- 一个C++ QObject派生类,它有一个类似的接口QIODevice.这对我的需求来说是完美的.我需要预先加载部分视频,并将其缓存以供以后使用.
有一个简单的解决方案满足我的需求吗?(我使用的是Qt 5.2)
我想在串行设备上写入。不幸的是,我感觉 QSerialPort 在 linux 下没有正确实现。与其他方法 (python) 相比,我得到 !sometimes! 当我尝试调用时程序挂起:
serial.open(QIODevice::ReadWrite)
Run Code Online (Sandbox Code Playgroud)
我正在使用http://qt-project.org/wiki/QtSerialPort 中的示例(见下文)。QSerialPortInfo 工作正常,因此我可以在打开它之前搜索我的设备。该问题出现在所有 Qt 5.* 系列中。我目前正在使用 OpenSuse 存储库中的 5.3 测试版。其他工具或方法证明设备正在工作(Windows 或 Python)。
// Example use QSerialPortInfo
foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {
qDebug() << "Name : " << info.portName();
qDebug() << "Description : " << info.description();
qDebug() << "Manufacturer: " << info.manufacturer();
// Example use QSerialPort
QSerialPort serial;
serial.setPort(info);
if (serial.open(QIODevice::ReadWrite)) // Hang of the program
serial.close();
}
Run Code Online (Sandbox Code Playgroud)
工作python脚本:
com_port = 4
baud_rate = '9600'
pySerial = serial.Serial(com_port, …Run Code Online (Sandbox Code Playgroud) 这是我在这个网站上的第一个问题!
我在从COM端口读取数据时遇到一些麻烦,我从另一个COM端口发送完整的消息,当我用Qt接收它时,它总是被切成多个子消息.
void SerialPortReader::init()
{
connect(m_serialPort, SIGNAL(readyRead()), this, SLOT(readData()));
}
void SerialPortReader::readData()
{
// m_serialPort->waitForReadyRead(200);
QByteArray byteArray = m_serialPort->readAll();
qDebug() << byteArray;
if(byteArray.startsWith(SOF) && byteArray.endsWith(EOF_LS)
&& byteArray.size() >= MIN_SIZE_DATA) {
decodeData(byteArray.constData());
} else {
qDebug() << "LIB SWCom : Unvalid trame !";
}
}
Run Code Online (Sandbox Code Playgroud)
发送的消息长度为25或27字节,如果我使用Putty或Hyperterminal来读取它们,我没有遇到麻烦.此外,如果我使用2个模拟串口COM进行通信,我没有这个问题...它只发生在Qt读取系统和2个物理COM端口...
我认为在准确发出readyRead信号时我没有得到...
我很困惑,提前谢谢你的帮助!
Qt是否有一QIODevice对可用于进程内点对点通信的对?
人们可以使用的混凝土QTCPSocket或QLocalSocket,但服务器端连接API是有点麻烦,而且似乎浪费通过OS强制的数据.
嘿所有(在那里:).
在Qt中将自定义类写入文件最好的方法是什么?
先感谢您.
马蒂亚斯
我目前正在将应用程序从Qt4(.8.4)移植到Qt5(.2.0).我几乎完成了所有已知的更改,例如弃用toAscii() - 函数,缺少QtGui等等.现在我们有一个使用声子框架的音乐播放器,它不再受支持,并被QtMultimedia模块取代,包括QMediaPlayer和一堆音频处理类.
我们的播放器实现采用自定义QIODevice.此设备为磁盘上的加密audiofiles提供接口.现在播放器向设备询问x字节,设备从加密文件中读取,解密播放器要求的字节并返回它们.
现在我在多媒体模块中搜索了一个函数来重用我的IODevice并找到了以下函数:
void setMedia(const QMediaContent & media, QIODevice * stream = 0)
Run Code Online (Sandbox Code Playgroud)
并使用如下:
m_pDecryptingMediaDevice = new BYIODevice(filename);
m_pDecryptingMediaDevice->open(QIODevice::ReadOnly);
m_pPlayer->setMedia(0, m_pDecryptingMediaDevice);
Run Code Online (Sandbox Code Playgroud)
其中m_pDecryptingMediaDevice是QIODevice-subclass,m_pPlayer是QMediaPlayer.
现在在Windows上,一切都按预期工作.QMediaplayer将其MediaStatus更改为QMediaPlayer :: LoadingMedia并向我的设备询问字节数.然后更改为QMediaPlayer :: State PlayingState,状态设置为BufferedMedia.一切安好.在Mac OS上的不幸(10.9.1)我只得到QMediaPlayer :: PlayingState而已.播放器/ audiobackend从不向我的设备询问字节数,也不调用任何其他功能.我不认为这个错误与自定义QIODevice有关,而是与QMediaPlayer有关,因为播放器甚至不询问任何字节或调用设备上的任何功能.
我只是试图将其分解为一个小测试项目:
QMediaPlayer *player = new QMediaPlayer(this);
QFile *music = new QFile("C:/Users/.../Music/Test.mp3");
music->open(QIODevice::ReadOnly);
player->setMedia(0, music);
connect(ui->pushButton, SIGNAL(clicked()), player, SLOT(play()));
connect(player, SIGNAL(stateChanged(QMediaPlayer::State)), this, SLOT(stateChanged(QMediaPlayer::State)));
Run Code Online (Sandbox Code Playgroud)
奇怪的是,这根本不起作用 - 不是在Windows上,而是在Mac OS上.总是有效的是给玩家一个URL
根据使用函数setMedia(const QMediaContent&media,QIODevice*stream = 0)将QIODevice流式传输到QMediaPlayer,是否有任何类似案例的经验?我坚持这个.
最好的问候和许多提前感谢.
一月
我正在使用QNetworkAccessManager来传输文件.在Debug中构建程序时,我的程序运行没有任何问题.但是在Release中构建问题有一个奇怪的问题:QIODevice :: read(QFile,"我的文件路径"):设备未打开
我的代码有什么问题?谢谢你的帮助!
QHttpMultiPart* getPacket(QString imgPath)
{
QHttpMultiPart *pMultiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
QFile *imgFile = new QFile(imgPath);
imgFile->setParent(pMultiPart);
Q_ASSERT(imgFile->open(QIODevice::ReadWrite));
QHttpPart imagePart;
imagePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("image/jpeg"));
imagePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"img\"; filename=\"target.jpg\""));
imagePart.setBodyDevice(imgFile);
pMultiPart->append(imagePart);
return pMultiPart;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
JTest testObj;
QNetworkAccessManager manager;
QHttpMultiPart *pHMP = getPacket("F:/Temp/1.jpg");
QNetworkReply *pNR = manager.put(QNetworkRequest(QUrl("http://192.168.11.102:8080/Test")), pHMP);
QObject::connect( pNR, SIGNAL(finished()), &testObj, SLOT(handleTransmissionFinished()) );
return a.exec();
}
Run Code Online (Sandbox Code Playgroud) qiodevice ×9
qt ×8
c++ ×5
qtcore ×3
qmediaplayer ×2
qml ×2
qtserialport ×2
qfile ×1
qprocess ×1
qt-quick ×1
qt5 ×1
qtmultimedia ×1
qtnetwork ×1
url ×1