Пожалуйста, войдите здесь. Часто задаваемые вопросы О нас
Задайте Ваш вопрос

Mixmonitor валит беседу с ошибкой Read factory .. and write factory .. both fail to provide 160 samples

0

Возникла необходимость записать диалог. После выполнения команды mixmonitor start SIP/channel /tmp/file.wav разговор завершается с нормальным статусом, в консоли ничего:

*CLI> mixmonitor start SIP/1-0000008b test.wav
  == Begin MixMonitor Recording SIP/1-0000008b
  == Spawn extension (default, NUM, 1) exited non-zero on 'SIP/1-0000008b'
  == End MixMonitor Recording SIP/1-0000008b

Включил дебаг режим и вот что там обнаружилось:

[Apr 25 12:43:29] VERBOSE[12029] app_mixmonitor.c:   == Begin MixMonitor Recording SIP/sipnet-00000086
[Apr 25 12:43:29] DEBUG[12029] audiohook.c: Read factory 0x8c09e58 and write factory 0x8c0a880 both fail to provide 160 samples
[Apr 25 12:43:29] DEBUG[12028] channel.c: Hanging up channel 'SIP/sipnet-00000086'
[Apr 25 12:43:29] DEBUG[12028] chan_sip.c: Hangup call SIP/sipnet-00000086, SIP callid 2343df1d02ae88a817686e142e9e92ca@sipnet.ru
[Apr 25 12:43:29] DEBUG[12028] res_rtp_asterisk.c: Setting RTCP address on RTP instance '0x8b9e158'
[Apr 25 12:43:29] DEBUG[12028] res_rtp_asterisk.c: Setting RTCP address on RTP instance '0x8ba1860'
[Apr 25 12:43:29] DEBUG[12028] res_rtp_asterisk.c: Setting RTCP address on RTP instance '0x8a81600'
[Apr 25 12:43:29] DEBUG[12028] netsock2.c: Splitting '212.53.40.40:5060' gives...
[Apr 25 12:43:29] DEBUG[12028] netsock2.c: ...host '212.53.40.40' and port '5060'.
[Apr 25 12:43:29] DEBUG[12028] chan_sip.c: Trying to put 'BYE sip:pro' onto UDP socket destined for 212.53.40.40:5060
[Apr 25 12:43:29] DEBUG[12028] app_dial.c: Exiting with DIALSTATUS=ANSWER.
[Apr 25 12:43:29] DEBUG[12028] pbx.c: Spawn extension (default,89035218914,1) exited non-zero on 'SIP/1-00000085'
[Apr 25 12:43:29] VERBOSE[12028] pbx.c:   == Spawn extension (default, 89035218914, 1) exited non-zero on 'SIP/1-00000085'
[Apr 25 12:43:29] DEBUG[12028] channel.c: Soft-Hanging up channel 'SIP/1-00000085'
[Apr 25 12:43:29] DEBUG[12028] channel.c: Hanging up channel 'SIP/1-00000085'
[Apr 25 12:43:29] DEBUG[12028] chan_sip.c: Hangup call SIP/1-00000085, SIP callid 3024246226@192_168_10_2
[Apr 25 12:43:29] DEBUG[12028] res_rtp_asterisk.c: Setting RTCP address on RTP instance '0x8aa7000'
[Apr 25 12:43:29] DEBUG[12028] res_rtp_asterisk.c: Setting RTCP address on RTP instance '0x8bfb518'
[Apr 25 12:43:29] DEBUG[12028] res_rtp_asterisk.c: Setting RTCP address on RTP instance '0x8728988'
[Apr 25 12:43:29] DEBUG[12028] netsock2.c: Splitting '10.10.10.10:8829' gives...
[Apr 25 12:43:29] DEBUG[12028] netsock2.c: ...host '10.10.10.10' and port '8829'.
[Apr 25 12:43:29] DEBUG[12028] chan_sip.c: Trying to put 'BYE sip:1@8' onto UDP socket destined for 89.169.180.214:8829
[Apr 25 12:43:29] DEBUG[1904] devicestate.c: No provider found, checking channel drivers for SIP - 1
[Apr 25 12:43:29] DEBUG[1904] chan_sip.c: Checking device state for peer 1
[Apr 25 12:43:29] DEBUG[1904] devicestate.c: Changing state for SIP/1 - state 1 (Not in use)
[Apr 25 12:43:29] DEBUG[1904] devicestate.c: device 'SIP/1' state '1'
[Apr 25 12:43:29] DEBUG[1903] app_queue.c: Device 'SIP/1' changed to state '1' (Not in use) but we don't care because they're not a member of any queue.
[Apr 25 12:43:29] DEBUG[12029] autochan.c: Removed autochan 0x8ba7318 from the list, about to free it
[Apr 25 12:43:29] DEBUG[1904] devicestate.c: No provider found, checking channel drivers for SIP - sipnet
[Apr 25 12:43:29] DEBUG[1904] chan_sip.c: Checking device state for peer sipnet
[Apr 25 12:43:29] DEBUG[1904] devicestate.c: Changing state for SIP/sipnet - state 1 (Not in use)
[Apr 25 12:43:29] DEBUG[1904] devicestate.c: device 'SIP/sipnet' state '1'
[Apr 25 12:43:29] DEBUG[1903] app_queue.c: Device 'SIP/sipnet' changed to state '1' (Not in use) but we don't care because they're not a member of any queue.
[Apr 25 12:43:29] VERBOSE[12029] app_mixmonitor.c:   == End MixMonitor Recording SIP/sipnet-00000086

и канал закрывается после первых строк

[Apr 25 12:43:29] DEBUG[12029] audiohook.c: Read factory 0x8c09e58 and write factory 0x8c0a880 both fail to provide 160 samples
[Apr 25 12:43:29] DEBUG[12028] channel.c: Hanging up channel 'SIP/sipnet-00000086'

Как то понять в чем проблема так и не удалось.. почитал исходный код, ошибка возникает тут (music/audiohook.c):

static struct ast_frame *audiohook_read_frame_both(struct ast_audiohook *audiohook, size_t samples)
{
        int i = 0, usable_read, usable_write;
        short buf1[samples], buf2[samples], *read_buf = NULL, *write_buf = NULL, *final_buf = NULL, *data1 = NULL, *data2 = NULL;
        struct ast_frame frame = {
                .frametype = AST_FRAME_VOICE,
                .subclass.codec = AST_FORMAT_SLINEAR,
                .data.ptr = NULL,
                .datalen = sizeof(buf1),
                .samples = samples,
        };

        /* Make sure both factories have the required samples */
        usable_read = (ast_slinfactory_available(&audiohook->read_factory) >= samples ? 1 : 0);
        usable_write = (ast_slinfactory_available(&audiohook->write_factory) >= samples ? 1 : 0);

        if (!usable_read && !usable_write) {
                /* If both factories are unusable bail out */
                ast_debug(1, "Read factory %p and write factory %p both fail to provide %zd samples\n", &audiohook->read_factory, &audiohook->write_factory, samples);
                return NULL;
        }

Если посмотреть список кодеков, то:

inconn*CLI> core show translation
         Translation times between formats (in microseconds) for one second of data
          Source Format (Rows) Destination Format (Columns)

           g723   gsm  ulaw  alaw g726aal2 adpcm  slin lpc10  g729 speex  ilbc  g726  g722 siren7 siren14 slin16  g719 speex16 testlaw
     g723     -  2000  1001  1001     3000  1001  1000  4000  5000  7999  8999  3000  1001   5001    4000   2001     -    7000    1001
      gsm  5998     -  1000  1000     2999  1000   999  3999  4999  7998  8998  2999  1000   5000    3999   2000     -    6999    1000
     ulaw  5000  1001     -     1     2001     2     1  3001  4001  7000  8000  2001     2   4002    3001   1002     -    6001       2
     alaw  5000  1001     1     -     2001     2     1  3001  4001  7000  8000  2001     2   4002    3001   1002     -    6001       2
 g726aal2  5999  2000  1001  1001        -  1001  1000  4000  5000  7999  8999  3000  1001   5001    4000   2001     -    7000    1001
    adpcm  5000  1001     2     2     2001     -     1  3001  4001  7000  8000  2001     2   4002    3001   1002     -    6001       2
     slin  4999  1000     1     1     2000     1     -  3000  4000  6999  7999  2000     1   4001    3000   1001     -    6000       1
    lpc10  5999  2000  1001  1001     3000  1001  1000     -  5000  7999  8999  3000  1001   5001    4000   2001     -    7000    1001
     g729  5999  2000  1001  1001     3000  1001  1000  4000     -  7999  8999  3000  1001   5001    4000   2001     -    7000    1001
    speex  5999  2000  1001  1001     3000  1001  1000  4000  5000     -  8999  3000  1001   5001    4000   2001     -    7000    1001
     ilbc  5998  1999  1000  1000     2999  1000   999  3999  4999  7998     -  2999  1000   5000    3999   2000     -    6999    1000
     g726  5999  2000  1001  1001     3000  1001  1000  4000  5000  7999  8999     -  1001   5001    4000   2001     -    7000    1001
     g722  5000  1001     2     2     2001     2     1  3001  4001  7000  8000  2001     -   4000    3999   1000     -    5999       2
   siren7  9999  6000  5001  5001     7000  5001  5000  8000  9000 11999 12999  7000  4999      -    5998   2999     -    7998    5001
  siren14 15998 11999 11000 11000    12999 11000 10999 13999 14999 17998 18998 12999  7999   8999       -   5999     -   10998   11000
   slin16  7000  3001  2002  2002     4001  2002  2001  5001  6001  9000 10000  4001  2000   3000    2999      -     -    4999    2002
     g719     -     -     -     -        -     -     -     -     -     -     -     -     -      -       -      -     -       -       -
  speex16  8000  4001  3002  3002     5001  3002  3001  6001  7001 10000 11000  5001  3000   4000    3999   1000     -       -    3002
  testlaw  5000  1001     2     2     2001     2     1  3001  4001  7000  8000  2001     2   4002    3001   1002     -    6001       -
удалить закрыть спам изменить тег редактировать

спросил 2012-04-25 13:29:22 +0400

champion Gravatar champion
154 11 3 13

обновил 2012-04-26 21:18:35 +0400

Comments

"Мы не ищем легких путей"(с) .

Покажите в коде , где там обрабатывается имя файла , переданное как аргумент, который Вы так рьяно скармливаете приложению.

zzuz ( 2012-04-25 14:12:05 +0400 )редактировать

Вы забыли о начале звонка. Приводите лиш следствие проблемы...

Zavr2008 ( 2012-04-25 20:37:16 +0400 )редактировать

Хм.. какую нужно предоставить информацию о начале звонка? Тут всё просто пир (1) звонит через сипнет на внешний номер Dial(SIP/sipnet/NUM)

champion ( 2012-04-25 21:26:27 +0400 )редактировать

sip debug нужен.

Zavr2008 ( 2012-04-27 07:22:53 +0400 )редактировать

5 Ответов

1

Господа, был баг в астериске. Обновился до последней версии все заработало. Спасибо за помощь и активность!

ссылка удалить спам редактировать

ответил 2012-04-28 00:02:11 +0400

champion Gravatar champion
154 11 3 13

Comments

ая ай. опять самоответ)

meral ( 2012-04-28 00:06:22 +0400 )редактировать

тебе кармы мало чтоле?

switch ( 2012-04-28 12:27:07 +0400 )редактировать

мне пофигу. просто это баг ;)

meral ( 2012-04-28 15:17:59 +0400 )редактировать
1

вы его уговариваете записать в какомто формате который он не знает или не может сдлеать тарнскодинг из формата звонка.

ссылка удалить спам редактировать

ответил 2012-04-25 14:25:16 +0400

meral Gravatar meral flag of Ukraine
23347 24 20 177
http://pro-sip.net/

Comments

Видимо транскодинг из формата звонка (g729<->g729). Файл тут ни при чем. будет показано в след. ответе

champion ( 2012-04-25 15:31:59 +0400 )редактировать

ну а кодек 729 у вас в системе есть? елси нету, то что же вы хотите? файл то не g729

meral ( 2012-04-25 15:56:32 +0400 )редактировать

Кодек есть. Звониться исправно. Только Mixmonitor не работает

champion ( 2012-04-25 20:01:57 +0400 )редактировать

core show translation что выдает?

meral ( 2012-04-25 23:00:05 +0400 )редактировать

Выложил внизу шапки темы

champion ( 2012-04-26 21:18:59 +0400 )редактировать
0

Для анализа могу предоставить доступ по ssh к астериску.. если у кого есть желание и интерес разобраться

ссылка удалить спам редактировать

ответил 2012-04-25 21:55:38 +0400

champion Gravatar champion
154 11 3 13

Comments

новая услуга бесплатный хелп по ссш?) посто крайне маловероятно чтото интересное найти.скорее всего банальная ошибка в диалплане.

meral ( 2012-04-25 22:58:35 +0400 )редактировать

Да не скорей всего , а в этом и ошибка.

zzuz ( 2012-04-26 00:29:41 +0400 )редактировать

Господа.. приведите пример что-ли, когда тут диалплан может быть замешан, ну честно, ума не приложу какое ему тут может быть место.

champion ( 2012-04-26 21:27:10 +0400 )редактировать
0

А что говорит ls -l / ?

ссылка удалить спам редактировать

ответил 2012-04-26 13:13:14 +0400

bolshoy_plohish Gravatar bolshoy_plohish
1388 25 20 38

обновил 2012-04-27 05:44:49 +0400

Comments

Что Вы там хотите увидеть? dc* файлы . Как это вообще относится к вопросу автора?

zzuz ( 2012-04-26 13:28:16 +0400 )редактировать

Права на запись в каталог tmp пользователю asterisk есть.

bolshoy_plohish ( 2012-04-27 05:48:23 +0400 )редактировать

А вообще о чем речь здесь идет?!

Какая версия asterisk?

Mixmonitor из AMI вызывается?

bolshoy_plohish ( 2012-04-27 06:00:58 +0400 )редактировать

И все таки права на запись в каталог есть? и кусочек диалплана было бы не плохо. Копать исходники конечно круто, но есть ли необходимость?

Злобный Мыш ( 2012-04-27 14:00:47 +0400 )редактировать

Да не. Он тупо из CLI команду выполняет.

zzuz ( 2012-04-27 14:13:12 +0400 )редактировать
0

Действо происходит в этой функции. Обращение к файлу идет только после astaudiohookread_frame, как показано в коде. Т.е. косяк на уровне этой функции.

static void *mixmonitor_thread(void *obj)
{
        struct mixmonitor *mixmonitor = obj;
        struct ast_filestream **fs = NULL;
        unsigned int oflags;
        char *ext;
        int errflag = 0;

        ast_verb(2, "Begin MixMonitor Recording %s\n", mixmonitor->name);

        fs = &mixmonitor->mixmonitor_ds->fs;

        /* The audiohook must enter and exit the loop locked */
        ast_audiohook_lock(&mixmonitor->audiohook);

        while (mixmonitor->audiohook.status == AST_AUDIOHOOK_STATUS_RUNNING && !mixmonitor->mixmonitor_ds->fs_quit) {
                struct ast_frame *fr = NULL;
                /* Вызов ast_audiohook_read_frame когда обращение к файлу дальше. Т.е. валиться при начале чтения фрейма и не имеет  значения файл */
                if (!(fr = ast_audiohook_read_frame(&mixmonitor->audiohook, SAMPLES_PER_FRAME, AST_AUDIOHOOK_DIRECTION_BOTH, AST_FORMAT_SLINEAR))) {
                        ast_audiohook_trigger_wait(&mixmonitor->audiohook);

                        if (mixmonitor->audiohook.status != AST_AUDIOHOOK_STATUS_RUNNING) {
                                break;
                        }
                        continue;
                }

                /* audiohook lock is not required for the next block.
                 * Unlock it, but remember to lock it before looping or exiting */
                ast_audiohook_unlock(&mixmonitor->audiohook);

                if (!ast_test_flag(mixmonitor, MUXFLAG_BRIDGED) || (mixmonitor->autochan->chan && ast_bridged_channel(mixmonitor->autochan->chan))) {
                        ast_mutex_lock(&mixmonitor->mixmonitor_ds->lock);
                        /* Initialize the file if not already done so */
                        if (!*fs && !errflag && !mixmonitor->mixmonitor_ds->fs_quit) {
                                oflags = O_CREAT | O_WRONLY;
                                oflags |= ast_test_flag(mixmonitor, MUXFLAG_APPEND) ? O_APPEND : O_TRUNC;

                                if ((ext = strrchr(mixmonitor->filename, '.')))
                                        *(ext++) = '\0';
                                else
                                        ext = "raw";

                                if (!(*fs = ast_writefile(mixmonitor->filename, ext, NULL, oflags, 0, 0666))) {
                                        ast_log(LOG_ERROR, "Cannot open %s.%s\n", mixmonitor->filename, ext);
ссылка удалить спам редактировать

ответил 2012-04-25 15:33:23 +0400

champion Gravatar champion
154 11 3 13

обновил 2012-04-25 15:34:09 +0400

Comments

это вы так думаете. 99% шанс что косяк на уровне соглашений и даилпална.ия вызывает 10% внутренних функция ядра(от общего количества)

meral ( 2012-04-25 15:57:12 +0400 )редактировать

Найти кусок нужного кода - это конечно круто. А вот не смочь его прочитать - еще круче.

zzuz ( 2012-04-25 17:58:26 +0400 )редактировать

Да и функция не та совсем.

zzuz ( 2012-04-25 18:00:32 +0400 )редактировать

zzuz, что мной было не замечено и не прочтено? А какая функция "та"?

champion ( 2012-04-25 19:58:42 +0400 )редактировать

Если вы про astaudiohookreadframeboth, в которой ошибка возникает, ну так она дергается в astaudiohookread_frame

champion ( 2012-04-25 20:03:36 +0400 )редактировать

Да.. и при чем здесь диалплан? Команда из CLi выполняется

champion ( 2012-04-25 20:11:37 +0400 )редактировать

То что исключение появляется на этой функции это не значит .что вышеприведенная функция это исключение вызывает.

zzuz ( 2012-04-26 00:31:05 +0400 )редактировать

mixmonitorthread -> astaudiohookreadframe -> astaudiohookreadframeboth -> ошибка, т.к. в структуре mixmonitor->audiohook->size < samples (160), не?

champion ( 2012-04-26 21:25:56 +0400 )редактировать

Ваш ответ

Please start posting your answer anonymously - your answer will be saved within the current session and published after you log in or create a new account. Please try to give a substantial answer, for discussions, please use comments and please do remember to vote (after you log in)!
[скрыть предварительный просмотр]

Закладки и информация

Добавить закладку

подписаться на rss ленту новостей

Статистика

Задан: 2012-04-25 13:29:22 +0400

Просмотрен: 2,612 раз

Обновлен: Apr 28 '12

Проект компании "АТС Дизайн"
Asterisk® и Digium® являются зарегистрированными торговыми марками компании Digium, Inc., США.
IP АТС Asterisk распространяется под лицензией GNU GPL.