Есть ли способ воспроизвести звук другим методом? - PullRequest
0 голосов
/ 11 декабря 2019

Я создал программу, которая загружает звук, а затем воспроизводит его с функцией PlaySound.

Моя проблема в том, что компилятор может воспроизводить только файлы wav , и обычно это такие файлывесят много и загружают много времени.

И если песня длится 30 секунд, когда песня заканчивается, происходит задержка на одну секунду, а затем она начинается снова. и это не интересно слышать, я хочу, чтобы песня была, например, 5 минут, чтобы пользователь не слышал задержку.

Мой «нянь» звук кошки - всего 30 секунд, и весят 25 МБ.

Есть ли способ воспроизведения файлов других типов?

Или уменьшить размер файла?


Моя функция:

Void PlayNyanSound()
{
    // Nyan cat sound

    string dir = "C:\\Users\\" + username() + "\\Documents\\Dragonite";
    string dwnld_URL = "https://srv-file4.gofile.io/download/TyizCg/y2mate.com%20-%20nyan_cat_sound_effect_12_OAN-miWCDm4_360p.wav";
    string savepath = "C:\\Users\\" + username() + "\\Documents\\Dragonite\\nyan.wav";

    CreateDirectory(dir.c_str(), NULL);

    URLDownloadToFile(NULL, dwnld_URL.c_str(), savepath.c_str(), 0, NULL);

    std::string pathtosound = "C:\\Users\\" + username() + "\\Documents\\Dragonite\\nyan.wav";
    while (true) {
        PlaySound(pathtosound.c_str(), 0, SND_SYNC);
    }

}

Редактировать:

С Strive'sпомогите, я пришел к такому результату. Но я ничего не слышу, это не работает.

#include <iostream>
#include <Windows.h>
#pragma comment (lib,"Winmm.lib")

using namespace std;

int main()
{

    while (true)
    {
        LPCSTR const Sound_File_Open = "open C:\\Users\\roeil\\Desktop\\nyan.mp3";

        MCIERROR open = mciSendString(Sound_File_Open, NULL, 0, NULL);

        MCIERROR play = mciSendString(Sound_File_Open, NULL, 0, NULL);
    }

    return 0;
}

Ответы [ 2 ]

0 голосов
/ 12 декабря 2019

И если песня длится 30 секунд, когда песня заканчивается, происходит задержка на одну секунду, а затем она начинается снова. и это не интересно слышать, я хочу, чтобы песня была, например, 5 минут, чтобы пользователь не слышал задержку.

Это то же самое, что и кейс Я видел раньше. Интересно, что все они хотят устранить задержку.

При использовании PlaySound(pathtosound.c_str(), 0, SND_ASYNC | SND_LOOP) для воспроизведения аудиофайлов неизбежно будет небольшая задержка, и время будет меньше 1 секунды.

InНа мой взгляд, эта задержка кажется неизбежной. Если вы не пытаетесь вырезать и копировать файл WAV от 30 секунд до 5 минут с помощью стороннего инструмента. И таким образом, вы можете избежать повторения 30 секунд звука.

Есть ли способ воспроизведения других типов файлов?

Вы можете использовать mciSendString .

mciSendStringФункция отправляет командную строку на устройство MCI. Устройство, на которое отправляется команда, указывается в командной строке.

mciSendString имеет много интересных функций. Вы можете получить команды из этого документа .

Пример использования mciSendStringto воспроизведения других аудиозаписей, например, зацикливание mp3.

#include <conio.h>
#include <Windows.h>
#include <iostream>

#pragma comment (lib,"Winmm.lib")
using namespace std;

int main() 
{

    LPCSTR const Sound_File_Open = "open C:\\Users\\xxx\\Desktop\\nyan-clipped.mp3 type mpegvideo alias Current_Sound_Command";

    MCIERROR open = mciSendString(Sound_File_Open, NULL, 0, NULL);

    MCIERROR play = mciSendString("play Current_Sound_Command repeat", NULL, 0,  NULL);

    system("pause");
}

Больше случаев:

Или уменьшить размер файла?

WAV-файл - это звук без потерь, несжатый звук. Вам следует попробовать формат с потерями, такой как mp3. Высококачественный mp3-файл часто неотличим от файла без потерь.

Если абсолютно необходимо, чтобы файл был .wav, существует способ уменьшить размер файла, хотя при этом вы потеряете больше качества. процесс, чем вы с помощью аудиокодека с потерями.

Возможные варианты для уменьшения размера файла:

  • Преобразование из стерео в моно
  • Понижение частоты дискретизации звука
  • Понижение битовой глубины звука

Вот пример того, как сжимать файлы WAV.

0 голосов
/ 11 декабря 2019

Возможно, вы захотите начать копаться в Windows Интерфейс управления мультимедиа (MCI) , если хотите воспроизводить другие типы мультимедиа. Microsoft также рекомендует его для воспроизведения больших файлов, что может показаться вам более интересным. Вот пример воспроизведения аудиофайла WAVE с MCI.

Существуют и другие альтернативы, такие как XAudio2 с DirectX, но это может быть очень сложно и очень быстро с гораздо большим количеством кода. Более простым решением было бы найти существующую библиотеку и включить ее в свой проект. Вот статья , в которой перечислены некоторые ваши варианты. Есть несколько бесплатных решений с открытым исходным кодом.

Какой бы путь вы ни выбрали, проверьте, поддерживает ли решение потоковую передачу звука из файла, то есть вы загружаете и воспроизводите только небольшие фрагменты аудиофайла сданное время. Загрузка нескольких аудиофайлов, занимающих несколько мегабайт, просто занимает память и может снизить производительность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...