Михаиллл
10 июня 2020 г. 3:04

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

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

  1. QByteArray array = "";
  2. QString str;
  3. QFile file(folder + "/1.wmv");
  4. if(file.open(QIODevice::ReadOnly)){
  5. str = file.readAll();
  6. array += str;
  7. }
  8. file.close();
  9. qDebug()<<"size"<<array.size()<<str.size();
  10. qDebug()<<str;

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

  1. size 20 10
  2. "0&?u?f?\u0011??"

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

3

Вам это нравится? Поделитесь в социальных сетях!

15
Evgenii Legotckoi
  • 10 июня 2020 г. 11:00
  • Ответ был помечен как решение.

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

    D
    • 10 июня 2020 г. 13:16

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

      Михаиллл
      • 10 июня 2020 г. 13:24

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

      1. QString folder = qApp->applicationDirPath();
      2.  
      3.  
      4. QByteArray array = "";
      5. QString str = "";
      6. QFile file(folder + "/1.wmv");
      7. if(file.open(QIODevice::ReadOnly)){
      8. QTextStream in(&file);
      9. while (!in.atEnd())
      10. {
      11. array.append( in.readLine() );
      12. }
      13. }
      14. file.close();
      15. //qDebug()<<"size"<<array.size()<<str.size();
      16. //qDebug()<<str;
      17.  
      18. //array += str;
      19.  
      20. QFile file2(folder + "/2.wmv");
      21. if(file2.open(QIODevice::WriteOnly)){
      22. file2.write(array);
      23. }
      24. file2.close();
        D
        • 10 июня 2020 г. 13:31

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

          Михаиллл
          • 10 июня 2020 г. 13:34

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

            Evgenii Legotckoi
            • 10 июня 2020 г. 13:34

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

              Михаиллл
              • 10 июня 2020 г. 13:36

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

                D
                • 10 июня 2020 г. 13:42

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

                  Михаиллл
                  • 10 июня 2020 г. 13:44

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

                    D
                    • 10 июня 2020 г. 13:45

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

                      Михаиллл
                      • 10 июня 2020 г. 13:52

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

                        D
                        • 10 июня 2020 г. 13:53
                        • (ред.)

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

                          Михаиллл
                          • 10 июня 2020 г. 13:56

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

                            D
                            • 10 июня 2020 г. 13:58
                            • (ред.)

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

                              Михаиллл
                              • 10 июня 2020 г. 14:03

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

                                Комментарии

                                Только авторизованные пользователи могут публиковать комментарии.
                                Пожалуйста, авторизуйтесь или зарегистрируйтесь
                                • Последние комментарии
                                • Evgenii Legotckoi
                                  16 апреля 2025 г. 17:08
                                  Благодарю за отзыв. И вам желаю всяческих успехов!
                                • IscanderChe
                                  12 апреля 2025 г. 17:12
                                  Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
                                • AK
                                  1 апреля 2025 г. 11:41
                                  Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
                                • Evgenii Legotckoi
                                  9 марта 2025 г. 21:02
                                  К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
                                • VP
                                  9 марта 2025 г. 16:14
                                  Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…