Михаиллл
Михаиллл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
                                ИМ
                                Игорь МаксимовNov. 22, 2024, 10:51 p.m.
                                Django - Tutorial 017. Customize the login page to Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                                Evgenii Legotckoi
                                Evgenii LegotckoiNov. 1, 2024, 12:37 a.m.
                                Django - Lesson 064. How to write a Python Markdown extension Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                                A
                                ALO1ZEOct. 19, 2024, 6:19 p.m.
                                Fb3 file reader on Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                                ИМ
                                Игорь МаксимовOct. 5, 2024, 5:51 p.m.
                                Django - Lesson 064. How to write a Python Markdown extension Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                                d
                                dblas5July 5, 2024, 9:02 p.m.
                                QML - Lesson 016. SQLite database and the working with it in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                                Now discuss on the forum
                                m
                                moogoNov. 22, 2024, 6:17 p.m.
                                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 LegotckoiJune 25, 2024, 1:11 a.m.
                                добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                                t
                                tonypeachey1Nov. 15, 2024, 5:04 p.m.
                                google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
                                NSProject
                                NSProjectJune 4, 2022, 1:49 p.m.
                                Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…

                                Follow us in social networks