Возникла необходимость записать диалог. После выполнения команды 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 -
Господа, был баг в астериске. Обновился до последней версии все заработало. Спасибо за помощь и активность!
вы его уговариваете записать в какомто формате который он не знает или не может сдлеать тарнскодинг из формата звонка.
Видимо транскодинг из формата звонка (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 )редактироватьДля анализа могу предоставить доступ по ssh к астериску.. если у кого есть желание и интерес разобраться
новая услуга бесплатный хелп по ссш?) посто крайне маловероятно чтото интересное найти.скорее всего банальная ошибка в диалплане.
meral ( 2012-04-25 22:58:35 +0400 )редактироватьГоспода.. приведите пример что-ли, когда тут диалплан может быть замешан, ну честно, ума не приложу какое ему тут может быть место.
champion ( 2012-04-26 21:27:10 +0400 )редактироватьА что говорит ls -l / ?
Что Вы там хотите увидеть? 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 )редактироватьДейство происходит в этой функции. Обращение к файлу идет только после 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);
это вы так думаете. 99% шанс что косяк на уровне соглашений и даилпална.ия вызывает 10% внутренних функция ядра(от общего количества)
meral ( 2012-04-25 15:57:12 +0400 )редактироватьНайти кусок нужного кода - это конечно круто. А вот не смочь его прочитать - еще круче.
zzuz ( 2012-04-25 17:58:26 +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 )редактироватьЗадан: 2012-04-25 13:29:22 +0400
Просмотрен: 2,603 раз
Обновлен: Apr 28 '12
Проект компании "АТС Дизайн"
Asterisk® и Digium® являются зарегистрированными торговыми марками компании
Digium, Inc., США.
IP АТС Asterisk распространяется под лицензией
GNU GPL.
"Мы не ищем легких путей"(с) .
Покажите в коде , где там обрабатывается имя файла , переданное как аргумент, который Вы так рьяно скармливаете приложению.
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 )редактировать