Михаиллл
МихаилллJune 9, 2020, 5:04 p.m.

Как прочитать файл .wmv

Добрый день.
Как в Qt прочитать файл .wmv?
Если делаю так с файлом в 10 мб:

    QByteArray array = "";
    QString str;
    QFile file(folder + "/1.wmv");
    if(file.open(QIODevice::ReadOnly)){
        str = file.readAll();
        array += str;
    }
    file.close();
    qDebug()<<"size"<<array.size()<<str.size();
    qDebug()<<str;

то получаю такой вывод

size 20 10
"0&?u?f?\u0011??"

Скажите пожалуйста, что я делаю не так и как исправить?

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

Do you like it? Share on social networks!

15
Evgenii Legotckoi
  • June 10, 2020, 1 a.m.
  • The answer was marked as a solution.

Под Windows метод readAll работает плохо на больших файлах, вернее совсем не работает.
Используйте или метод readLine или обычный метод read с указанием размера считываемого массива.

    D
    • June 10, 2020, 3:16 a.m.

    Функция readAll возвращает QByteArray, а затем у вас зачем-то происходит преобразование в QString. Соответственно, ваша строка окончится на первом попавшемся нулевом байте из файла. Запишите возврат функции readAll в другую переменную типа QByteArray и выведите на экран её length() - она будет равна размеру файла. А чтобы добавить один QByteArray к другому, нужно использовать функцию append().

      Михаиллл
      • June 10, 2020, 3:24 a.m.

      Я так сделал и пытаюсь все записать в соседний файл, но размер 2-го файла получается почему-то больше и он не воспроизводится.
      Скажите пожалуйста что не так и как правильно?

          QString folder = qApp->applicationDirPath();
      
      
          QByteArray array = "";
          QString str = "";
          QFile file(folder + "/1.wmv");
          if(file.open(QIODevice::ReadOnly)){
              QTextStream in(&file);
              while (!in.atEnd())
              {
                 array.append( in.readLine() );
              }
          }
          file.close();
          //qDebug()<<"size"<<array.size()<<str.size();
          //qDebug()<<str;
      
          //array += str;
      
          QFile file2(folder + "/2.wmv");
          if(file2.open(QIODevice::WriteOnly)){
              file2.write(array);
          }
          file2.close();
      
        D
        • June 10, 2020, 3:31 a.m.

        Вы пытаетесь соединить встык два видеофайла? Такой трюк пройдёт только с форматом .TS. Для объединения нескольких .WMV нужно демультиплексировать каждый файл, выделить потоки данных и мультиплексировать в единый файл. Для выполнения такой задачи обычно используют FFMpeg.

          Михаиллл
          • June 10, 2020, 3:34 a.m.

          Вот беда. Мне бы нужно было просто копировать файлы на сервер и обратно. А нет ли вариантов попроще переводить файлы в строку и обратно?

            Evgenii Legotckoi
            • June 10, 2020, 3:34 a.m.

            Может просто QFile::copy? Или вы по сети передаёте?

              Михаиллл
              • June 10, 2020, 3:36 a.m.

              Передаю по сети, предворительно запихнув в джисон. Так что без строки не обойтись((

                D
                • June 10, 2020, 3:42 a.m.

                Передавать большие двоичные данные через JSON - не самое эффективное решение. Но если вам так нужно, то используйте функции toBase64() и fromBase64().

                  Михаиллл
                  • June 10, 2020, 3:44 a.m.

                  Но что же делать с переводом файла в строку и последующей записью?

                    D
                    • June 10, 2020, 3:45 a.m.

                    У вас ещё стоит задача склеивания видеофайлов или просто передать отдельные файлы через строку?

                      Михаиллл
                      • June 10, 2020, 3:52 a.m.

                      Просто передать, потом обратно получить и записать в файл.

                        D
                        • June 10, 2020, 3:53 a.m.
                        • (edited)

                        array.toBase64() вернёт вам данные в формате base-64, которые спокойно можно записывать в строку. А чтобы из base-64 получить исходные двоичные данные, вызываете fromBase64() и записываете в .wmv

                          Михаиллл
                          • June 10, 2020, 3:56 a.m.

                          Хорошо, спасибо, но вопрос с чтением, мне все еще нужно прочитать файл так, чтобы его можно было записать. Может быть вы знаете как?

                            D
                            • June 10, 2020, 3:58 a.m.
                            • (edited)

                            читайте в array c помощью readAll(), а потом file.write(array.toBase64());

                              Михаиллл
                              • June 10, 2020, 4:03 a.m.

                              Спасибо, работает

                                Comments

                                Only authorized users can post comments.
                                Please, Log in or Sign up
                                AD

                                C ++ - Test 004. Pointers, Arrays and Loops

                                • Result:50points,
                                • Rating points-4
                                m

                                C ++ - Test 004. Pointers, Arrays and Loops

                                • Result:80points,
                                • Rating points4
                                m

                                C ++ - Test 004. Pointers, Arrays and Loops

                                • Result:20points,
                                • Rating points-10
                                Last comments
                                i
                                innorwallNov. 14, 2024, 12:07 p.m.
                                Circuit switching and packet data transmission networks Angioedema 1 priligy dapoxetine
                                i
                                innorwallNov. 14, 2024, 11:42 a.m.
                                How to Copy Files in Linux If only females relatives with DZ offspring were considered these percentages were 23 order priligy online uk
                                i
                                innorwallNov. 14, 2024, 9:09 a.m.
                                Qt/C++ - Tutorial 068. Hello World using the CMAKE build system in CLion ditropan pristiq dosing With the Yankees leading, 4 3, Rivera jogged in from the bullpen to a standing ovation as he prepared for his final appearance in Chicago buy priligy pakistan
                                i
                                innorwallNov. 14, 2024, 4:05 a.m.
                                EVILEG-CORE. Using Google reCAPTCHA 2001; 98 29 34 priligy buy
                                i
                                innorwallNov. 14, 2024, 4 a.m.
                                PyQt5 - Lesson 007. Works with QML QtQuick (Signals and slots) priligy 30mg Am J Obstet Gynecol 171 1488 505
                                Now discuss on the forum
                                i
                                innorwallNov. 14, 2024, 3:39 a.m.
                                добавить qlineseries в функции priligy amazon canada 93 GREB1 protein GREB1 AB011147 6
                                i
                                innorwallNov. 11, 2024, 10:55 a.m.
                                Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
                                9
                                9AnonimOct. 25, 2024, 9:10 a.m.
                                Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

                                Follow us in social networks