Как кодировать WAV для игры с SIPp

Изучив другой вопрос, связанный с SIPp, я узнал, что теперь можно воспроизводить файлы WAV, используя rtp_stream действие.

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

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

Я также пытался использовать sox для преобразования этого файла, но безуспешно.

Может кто-нибудь рассказать мне, как создать действительный файл WAV для использования с SIPp?

Это мое recv 200 OK Команда, которая включает в себя действие воспроизведения аудио:

<recv response="200" rtd="true">
  <action>
    <exec rtp_stream="sorry_dave.wav,-1" />
  </action>
</recv>

3 ответа

Решение

Я искал различные кодировки WAV-файлов и нашел много их в Википедии.

Я нашел один файл (8,000 Hz µ-Law), который работает правильно с rtp_stream="8kulaw.wav,-1,0" параметр exec.

Это информация о файле:

ubuntu@mylinux:~/$ file 8kulaw.wav
8kulaw.wav: RIFF (little-endian) data, WAVE audio, ITU G.711 mu-law, mono 8000 Hz

Я пытался закодировать этот файл в той же конфигурации, используя этот Sox команда, но она не сработала:

sox -r 8000 -e u-law sorry_dave.wav sorry_dave4.wav

Вы можете использовать Audacity для кодирования WAV для SIPP. Выберите в нижней строке 8000 Гц для проекта и экспортируйте аудио как "Другой сжатый формат": нажмите "Параметры" и выберите "WAV (Microsoft)" Заголовок и "A-Law" Кодировка (для PCMA) или "U-Law" (для PCMU).

Вам также следует проверить файл сценария: сообщение SDP должно содержать аудио PCMA или PCMU и использовать "rtpstream_audio_port" следующим образом (для PCMA):

  m=audio [rtpstream_audio_port] RTP/AVP 8
  a=rtpmap:8 PCMA/8000

Извините - сейчас это немного расплывчато, так как я так давно не делал этого. Насколько я помню, кодировка u-закона не работала в sipp, поэтому я закодировал файл как закон, используя этот скрипт, который я создал. Я заметил, что были некоторые нюансы для конвертации с использованием sox. На мой взгляд, у вас либо не совпадает SDP, либо вы неправильно кодируете файл, убедитесь, что вы используете только один канал. Попробуйте методы и код, который я разместил ниже.

Заголовок файла должен прочитать

Размер файла: 54.7k Битрейт: 64.1k Кодировка: A-law
Каналы: 1 @ 13-бит
Частота дискретизации: 8000 Гц
Replaygain: выкл
Продолжительность: 00:00:06.83

или же

Размер файла: 54.7k Битрейт: 64.1k Кодировка: u-law
Каналы: 1 @ 14 бит
Частота дискретизации: 8000 Гц
Replaygain: выкл
Продолжительность: 00:00:06.83

./wav_to_gsm.sh Извини_dave.wav Извини_dave_alaw.wav sox alaw

#!/bin/bash

if [ -z "$4" ];then
   echo "usage: $0 [input.wav] [output.gsm] [sox|gst] [alaw|ulaw]"
   exit
fi

  IN=$1
 OUT=$2
TOOL=$3
 ENC=$4

function conv1()
{
   if [ $ENC == "alaw" ];then
      sox $IN -r 8000 -c 1 -e a-law $OUT resample -ql
   else
      sox $IN -r 8000 -c 1 -e u-law $OUT resample -ql  #default
   fi

   #notes:
   #the output file extension (wav or gsm) will change how sox performs the encoding
   #use .wav for sipp RTP
      Encoding: u-law                    Encoding: A-law
      Channels: 1 @ 14-bit               Channels: 1 @ 13-bit
   #use .gsm for asterisk music on hold
      Encoding: GSM
      Channels: 1 @ 16-bit

}

function conv2()
{
   if [ $ENC == "alaw" ];then
      gst-launch  filesrc location=$IN \
      ! wavparse \
      ! audioconvert \
      ! audioresample \
      ! alawenc \
      ! audio/x-alaw, rate=8000, channels=1 \
      ! wavenc \
      ! filesink location=$OUT
   else
      gst-launch  filesrc location=$IN \
      ! wavparse \
      ! audioconvert \
      ! audioresample \
      ! mulawenc \
      ! audio/x-mulaw, rate=8000, channels=1 \
      ! wavenc \
      ! filesink location=$OUT
   fi

   # notes: 
   # file output extension of wav and gsm are interchangeable in the converted format
}

if [ $3 == "gst" ];then
   conv2
else
   conv1
fi
Другие вопросы по тегам