Михаиллл
Михаиллл9 июня 2020 г. 17:04

Как прочитать файл .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??"

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

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

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

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

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

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

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

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

      Я так сделал и пытаюсь все записать в соседний файл, но размер 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
        • 10 июня 2020 г. 3:31

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                                Комментарии

                                Только авторизованные пользователи могут публиковать комментарии.
                                Пожалуйста, авторизуйтесь или зарегистрируйтесь
                                AD

                                C++ - Тест 004. Указатели, Массивы и Циклы

                                • Результат:50баллов,
                                • Очки рейтинга-4
                                m
                                • molni99
                                • 26 октября 2024 г. 8:37

                                C++ - Тест 004. Указатели, Массивы и Циклы

                                • Результат:80баллов,
                                • Очки рейтинга4
                                m
                                • molni99
                                • 26 октября 2024 г. 8:29

                                C++ - Тест 004. Указатели, Массивы и Циклы

                                • Результат:20баллов,
                                • Очки рейтинга-10
                                Последние комментарии
                                ИМ
                                Игорь Максимов22 ноября 2024 г. 19:51
                                Django - Урок 017. Кастомизированная страница авторизации на Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                                Evgenii Legotckoi
                                Evgenii Legotckoi31 октября 2024 г. 21:37
                                Django - Урок 064. Как написать расширение для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                                A
                                ALO1ZE19 октября 2024 г. 15:19
                                Читалка fb3-файлов на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                                ИМ
                                Игорь Максимов5 октября 2024 г. 14:51
                                Django - Урок 064. Как написать расширение для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                                d
                                dblas55 июля 2024 г. 18:02
                                QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                                Сейчас обсуждают на форуме
                                m
                                moogo22 ноября 2024 г. 15:17
                                Mosquito Spray System Effective Mosquito Systems for Backyard | Eco-Friendly Misting Control Device & Repellent Spray - Moogo ; Upgrade your backyard with our mosquito-repellent device! Our misters conce…
                                Evgenii Legotckoi
                                Evgenii Legotckoi24 июня 2024 г. 22:11
                                добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                                t
                                tonypeachey115 ноября 2024 г. 14:04
                                google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
                                NSProject
                                NSProject4 июня 2022 г. 10:49
                                Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…

                                Следите за нами в социальных сетях