Конвертация музыки в формат FLAC с использованием CUDA

    Недавно я наткнулся на энкодер, работающий с форматом FLAC и перекладывающий часть процесса кодирования на GPU, используя CUDA. Программа называется FlaCuda и взять её можно здесь. Несмотря на то, что написана с использованием .NET, она прекрасно работает при участии Mono. Во всяком случае, никаких трудностей с её использованием на Ubuntu 9.10 amd64 у меня не возникло.

    Программка работает довольно шустро, при сжатии одного и того же аудиофайла flac, flake и flacuda показали следующие результаты (amd x2 4200+, geforce 9800 GT):

    программа время кодирования размер конечного файла
    flac 127 с. 425.3 Мб
    flake 106 с. 425.9 Мб
    flacuda 24 c. 424.1 Мб


    Уровень сжатия у всех программ ставился 8. Получаем солидный пятикратный прирост в скорости. Правда, такого выигрыша можно добиться лишь на длинных файлах. На 3-6-минутных записях время кодирования сокращается примерно вдвое.

    Программа умеет брать данные из стандартного ввода и выводить на стандартный вывод, что позволяет воткнуть её в конвейер. Например, я вполне успешно модифицировал cue2tracks для работы с flacuda.

    Теперь о минусах.  Программа построена на основе кодека flake, поэтому 24-битный звук сжимать не умеет. Очень обидно. Больше недочётов не заметил.

    Сам автор предупреждает, что программа всё ещё находится в стадии альфа, поэтому желательно перепроверять полученные файлы. Например, можно полученный .flac перегнать обратно в .wav и сравнить его с исходным, посчитав контрольную сумму того и другого. За развитием можно следить форуме www.hydrogenaudio.org, и там же можно связаться с автором.

    Ну и напоследок — бонус для пользователей linux, изменённый скрипт cue2tracks, в который добавлена поддержка FlaCuda. Для работы скрипта нужно поместить исполняемый файл «CUETools.FlaCuda.exe» в "/usr/bin" под именем flacuda, а dll-библиотеки — в "/usr/lib".

    Upd. Для пользователей Gentoo powerman добавил пакеты для flacuda и изменённого cue2tracks в оверлей powerman.

    Скачать скрипт.
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 64

    • UFO just landed and posted this here
        0
        Можно и туда, конечно. Лишь бы в PATH было прописано. Я просто не привык туда что-то ставить.
        • UFO just landed and posted this here
            0
            Дело житейское. Поправил на /usr/local
              0
              Может глупый вопрос, но что тогда должно храниться в /usr/bin?
                0
                Отдайте эт и директории на растерзание пакетному менеджеру :)

                Ну и man hier
                • UFO just landed and posted this here
            +8
            Потестил у себя (-8, Core i7 920, GTX 285, Win 7 x64):
            flac 26 с. 113.9 Мб
            flacuda 2.5 с. 111.42 Мб

            Сжимает примерно также, но вот выигрыш во времени просто огромен, примерно в 10 раз быстрее
            Забрал, буду пользоваться
              +3
              под «кодек» вы подразумеваете программу-энкодер? Или я чего-то не понял?
                0
                Да. Кодеком, пожалуй, называть её некорректно. Всё-таки, она не декодирует флак. Просто «кодек» короче. :)
                  +2
                  это называется кодер, букв столько же, но смысл на месте.
                    +2
                    Исправил на «энкодер». Всё-таки кодерами у нас часто называют программистов. Путаница будет.
                • UFO just landed and posted this here
                    0
                    Всё-таки чтобы не запутаться: DivX — это кодек, который могут использовать программы-экнодеры, как, например, POcketDivXEncoder? Что в данном топике — кодек, а что — программа, способная его использовать?
                    • UFO just landed and posted this here
                      • UFO just landed and posted this here
                  +1
                  Думал добавить в AUR, но по ссылке «Source code» с официального сайта исходники на самом деле недоступны, а в архиве FlaCuda09Linux.rar свалены exe и dll О.о
                  Ручное переименование в flacuda и свалка dll в /usr/local/lib это довольно странная прихоть разработчиков. Счастье, что хотя бы wine не требуется.
                    0
                    Ручное переименование в flacuda — это странная прихоть меня самого. Программа работает и так, распакуйте архив и запускайте. Распихивать файлы по папкам и переименовывать бинарник нужно только если вы хотите использовать изменённый мной cue2tracks.
                      0
                      А исходники ещё вчера-позавчера были на месте. Думаю, это временные какие-то глюки. Если хотите, могу исходники положить куда-нибудь, я их у себя сохранял.
                        0
                        Не нужно, спасибо. В общем-то, это я зря придрался, можно частично стереть url и найти исходники =)
                        А синтаксис flac и flacuda совпадает? Было бы неплохо иметь симлинк с именем /usr/bin/flac на /usr/bin/flacuda и не переписывать скрипты.
                          +1
                          Синтаксис совпадает с flake, flacuda на нём основан. Так что, если у вас в скриптах для flac используется прямое указание имени конечного файла (опцией -o), то ничего не выйдет.
                            0
                            В принципе, можно написать скрипт-враппер, который будет смотреть, какие вы аргументы указываете при вызове flac и заменять их на flake-совместимые.
                              0
                              Хм, да, если уж костылить, то это наиболее простой путь.
                      • UFO just landed and posted this here
                          0
                          Стоит перенести топик в тематический блог
                          сюда habrahabr.ru/blogs/sound_and_music/
                          или
                          сюда habrahabr.ru/blogs/CUDA/
                            0
                            Перенёс в «Звук и Музыка». Всё-таки в блоге «CUDA» больше про программирование.
                            0
                            очень и очень хорошо, побольше бы cuda-приложений и скриптов
                              +1
                              На самом деле, приятней было бы распространение OpenCL-приложений. Они всё-таки универсальней. Но на безрыбье и такие подвижки радуют.
                                0
                                не могу не согласиться, ага
                              0
                              Спасибо. Видяха есть — будет интересно испытать КУДу на реальных задачах — а не на тряпках в Mirror's Edge!
                                0
                                «Во всяком случае, у меня не возникло никаких трудностей с её использованием на моей Ubuntu 9.10 amd64 не возникло.»

                                P.S. Простите за занудство.
                                  +1
                                  Ой. Спасибо. Сколько ни проверяй, а всё равно где-нибудь ляп останется.
                                  0
                                  С большим нетерпением жду, когда видео-чип станет полноправным вычислительным ядром, на котором можно будет считать более-менее широкий спектр задач из ряда повседневных. Вот и еще одна ласточка! Выигрыш в скорости просто потрясающий! Класс!
                                    0
                                    современные видеочипы уже имеют сотни вычислительных ядер, но использовать их в широком спектре бытовых задачах пока не получиться.
                                    но это пока :).
                                    0
                                    Так, никто и не упомянул — файл сжимается правильно? Оригинал и сжатый-расжатый файл совпадают?
                                      0
                                      У меня пока ошибок не было. Оригинал и сжатый-расжатый файл совпадали. Но я скачал новую версию где-то дня через 2 после её выхода, в ней была поправлена серьёзная ошибка, так что перепроверка не помешает.
                                      –3
                                      Ура! Ну вот теперь можно будет быстро конвертнуть всю коллекцию mp3 во FLAC и наслаждаться тёплым ламповым звуком =)
                                        +3
                                        эм а какой смысл конвертировать во flac из формата с lossy сжатием?
                                          0
                                          Автор коммента изящно шутит.
                                          Речь про «теплый ламповый звук»: пруфлинк: lurkmore.ru/%D0%A2%D0%9B%D0%97
                                            0
                                            Вы видимо не совсем поняли моего сарказма ;-)
                                            –2
                                            Высказаться успели, не поняв весь бред сказанного.
                                            Вам надо расставить все точки на «и»:
                                            www.foobar2000.ru/wiki/codecs/lossy
                                            www.foobar2000.ru/wiki/codecs/lossless/start
                                            0
                                            еще б кто нибудь плагин для sound forge сварганил, цены ему не было б.
                                              0
                                              А какую видеокарту программа требует? Любая Nvidia подойдёт или какая-то специальная? Дрова нужны какие-то что бы это всё работало?
                                              0
                                              А что за flake? В первый раз просто вижу.
                                                +1
                                                А никто не знает, что ей нужно для запуска и работы? Иксы нужны? Загруженные проприетарные модули карточек? Соответствующие настройки Device в иксах? glx в иксах? Что-то ещё?

                                                Есть мысль, что по идее нужно бы интегрировать такое счастье в качестве бенчмарка к нам — надо только понять минимальные prerequisites.
                                                  0
                                                  Только что пробовал. Иксы не нужны, загруженный модуль не нужен.
                                                    +1
                                                    Эм… А через что она тогда работает-то? Через какой /dev обращается?
                                                      0
                                                      Знаете, это я затупил, прошу прощения. Забыл, что модуль может автоматически подгружаться. Получается, что модуль всё-таки нужен.
                                                        0
                                                        Ну и, соответственно, через /dev/nvidia0 или /dev/nvidiactl?
                                                          +1
                                                          strace flacuda 1.wav | grep '/dev/':

                                                          open("/dev/urandom", O_RDONLY) = 3
                                                          open("/dev/shm/", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
                                                          statfs("/dev/shm/", {f_type=0x1021994, f_bsize=4096, f_blocks=257095, f_bfree=257087, f_bavail=257087, f_files=257095, f_ffree=257090, f_fsid={0, 0}, f_namelen=255, f_frsize=4096}) = 0
                                                          unlink("/dev/shm/mono.6198") = 0
                                                          open("/dev/shm/mono.6245", O_RDWR|O_CREAT|O_EXCL|O_NOFOLLOW|O_CLOEXEC, 0640) = 3
                                                          open("/dev/null", O_RDWR) = 3
                                                          open("/dev/nvidiactl", O_RDWR) = 4
                                                          open("/dev/nvidia0", O_RDWR) = 5
                                                          open("/dev/nvidia0", O_RDWR) = 6
                                                          open("/dev/nvidia0", O_RDWR) = 7
                                                          open("/dev/nvidiactl", O_RDWR) = 8
                                                          open("/dev/nvidiactl", O_RDWR) = 9
                                                          unlink("/dev/shm/mono.6245") = 0


                                                          Как-то ещё можно определить?
                                                            +1
                                                            В целом понятно, спасибо.
                                                            А так — можно ещё смотреть через lsof, fuser и подобные утилиты :)
                                                            0
                                                            А то я, если честно, минут 5 соображал, как определить, какие устройства может использовать процесс.
                                                    0
                                                    К сожалению являюсь обаладателем видюхи ATI (3870), для ATI Stream появится подобный софт? Так же хотелось бы и видео энкодить
                                                      0
                                                      вряд ли
                                                      CUDA — разработка nVidia
                                                        0
                                                        дык у AMD есть ATI stream… я интересуюсь под него есть ли софт подобный?
                                                      0
                                                      Это очень круто!
                                                      • UFO just landed and posted this here
                                                          0
                                                          Badaboomit

                                                          Только он платный :(
                                                          • UFO just landed and posted this here
                                                          0
                                                          $ strace ./flacuda
                                                          execve("./flacuda", ["./flacuda"], [/* 43 vars */]) = -1 ENOEXEC (Exec format error)
                                                          dup(2)                                  = 3
                                                          fcntl(3, F_GETFL)                       = 0x8002 (flags O_RDWR|O_LARGEFILE)
                                                          fstat(3, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 5), ...}) = 0
                                                          mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1fa2b1d000
                                                          lseek(3, 0, SEEK_CUR)                   = -1 ESPIPE (Illegal seek)
                                                          write(3, "strace: exec: Exec format error\n", 32strace: exec: Exec format error
                                                          ) = 32
                                                          close(3)                                = 0
                                                          munmap(0x7f1fa2b1d000, 4096)            = 0
                                                          exit_group(1)                           = ?

                                                          брал здесь:
                                                          www.cuetools.net/install/FlaCuda09Linux.rar
                                                            0
                                                            Я добавил в оверлей powerman для Gentoo пакеты для flacuda и cue2tracks с Вашим патчем.
                                                              0
                                                              Спасибо, добавил в топик.
                                                                0
                                                                Заменил flacuda на flaccl и подправил патч для совместимости с текущим cue2tracks.

                                                            Only users with full accounts can post comments. Log in, please.