2015-03-28 2 views
0

Я ищу способ зашифровать видеофайл, а затем использовать его расшифровать для воспроизведения и воспроизвести его напрямую.Как я могу использовать Qt для шифрования/дешифрования/воспроизведения видео?

+0

Это не работает, потому что вы пытаетесь прочитать данные видео в 'QUrl', что приводит к недействительному' QUrl', который 'player' (вы не указали, что это) явно не может открыть. Поскольку 'QMediaPlayer' может воспроизводить видео напрямую из' QUrl', возможно, вы должны указать _why_, вам нужно играть с 'QDataStream'? – cmannett85

+0

Мои извинения. @ Cmannett85 Не могли бы вы прочитать мой ответ и помочь мне? – Nya

ответ

1

setMedia принимает QIODevice в качестве второго аргумента:

#include <QMediaPlayer> 
    #include <QApplication> 
    #include <QFile> 
    int main(int argc, char ** argv) 
    { 
     QApplication app(argc,argv); 
     QString fileName = app.arguments().at(1); 

     QFile io(fileName); 
     io.open(QFile::ReadOnly); 

     QMediaPlayer player; 

     player.setMedia(QUrl("test.mp3"), &io); 
     player.play(); 

     return app.exec(); 
    } 

но только в том случае, если вы действительно значит QDataStream:

QDataStream буферизуется Ио, QIODevice прямая И.О., они не совместимы, так что вы должны двойной буфер, как это:

#include <QMediaPlayer> 
#include <QApplication> 
#include <QFile> 
#include <QBuffer> 
#include <QDataStream> 
int main(int argc, char ** argv) 
{ 
    QApplication app(argc,argv); 
    QString fileName = app.arguments().at(1); 

    // our double buffer 
    QByteArray bufferSpace; 

    // our stream on which we can put "media" data 
    QDataStream stream(&bufferSpace, QIODevice::WriteOnly); 

    // this is just demo data 
    QFile io(fileName); 
    io.open(QFile::ReadOnly); 
    stream << io.readAll(); 

    // open an IO Device on our buffer 
    QBuffer buffer(&bufferSpace); 
    buffer.open(QBuffer::ReadOnly); 

    // give the IO to the media player 
    QMediaPlayer player; 
    player.setMedia(QUrl("test.mp3"), &buffer); 
    player.play(); 

    return app.exec(); 
} 

редактировать

вот более быстрая версия, что «крипт» код, который вы публикуемые без использования буфера для всего файла:

#include <QMediaPlayer> 
#include <QApplication> 
#include <QFile> 
#include <QBuffer> 
#include <QDataStream> 

static const unsigned char key = 0xAB; 
class MyFunnyCrypto : public QFile /*or subclass any other IO*/ 
{ 
protected: 
    virtual qint64 readData(char *data, qint64 maxSize) 
    { 
     qint64 r = QFile::readData(data, maxSize); 
     if (r > 0) { 
      for (qint64 i = 0; i < r; i++) { 
       data[i] = data[i]^key; 
      } 
     } 
     return r; 
    } 

}; 


int main(int argc, char ** argv) 
{ 
    QApplication app(argc,argv); 
    QString fileName = app.arguments().at(1); 


    MyFunnyCrypto io; 
    io.setFileName(fileName); 
    io.open(QFile::ReadOnly); 

    // give the IO to the media player 
    QMediaPlayer player; 
    player.setMedia(QUrl("test.mp3"), &io); 
    player.play(); 

    return app.exec(); 
} 
+0

Большое спасибо. Не могли бы вы прочитать мой ответ ниже и помочь мне? – Nya

0

Благодаря @aep. Это не имеет ничего общего с QDataStream, и это довольно просто. Шифрование:

unsigned char key = 0xAB; 
QFile file("test.mp3"); 
file.open(QIODevice::ReadOnly); 
QByteArray byteArray = file.readAll(); 
for(int i=1024;i<byteArray.length();i++){ 
    byteArray[i] = byteArray[i]^key; 
} 
file.close(); 

QFile encrypted("encrypted.mp3"); 
encrypted.open(QIODevice::WriteOnly); 
encrypted.write(byteArray); 
encrypted.close(); 

и дешифрования:

unsigned char key = 0xAB; 
QFile file("encrypted.mp3"); 
file.open(QIODevice::ReadOnly); 
auto byteArray = file.readAll(); 
for(int i=1024;i<byteArray.length();i++){ 
    byteArray[i] = byteArray[i]^key; 
} 

QBuffer buffer(&byteArray); 
buffer.open(QBuffer::ReadOnly); 

// give the IO to the media player 
QMediaPlayer player; 
player.setMedia(QUrl(), &buffer); 
player.play(); 

В для петли, я хочу объявить я как qint64, а не int. Но компилятор показывает QByteArray::​operator[](int i).

+0

int кажется правильным, поскольку промежуточный буфер может содержать только элементы INT_MAX. зачем вам здесь qint64? – aep

+0

Я хочу манипулировать файлом размером около 200 м. О, 'int' тоже должен работать. @aep – Nya

+0

см. мой отредактированный ответ. Это позволит вам это сделать. @Nya – aep

Смежные вопросы