2014-11-19 2 views
0

LANG: C/ENV: LinuxStreaming двигатели передового опыта в C

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

Использование lseek() функция, Я передаю дескриптор открытого потокового файла в качестве первого аргумента, плюс я использую UDP для передачи, что-то вроде следующего кода:

transport_fd = open(tsfile, O_RDONLY); 
int offset = 1024; 
off_t offsetIndicator; 
if ((offsetIndicator=lseek(transport_fd, offset, SEEK_CUR))<0) printf("Error seeking\n"); 

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

Что я должен обратить внимание на ?, то есть: как попытка сна() или nanosleep() после ищу в файл для того, чтобы изменения вступили в силу.

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

EDIT:

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

КОД SNIPPET:

while (!completed) 
{ 
    while (/* Comparing conditions */ && !completed) 
    { 
     if (seekLck == 1) // seekLck is a semaphore to test seek signal from father process initiated by 0 
     { 
      int offset = 1024; 
      off_t offsetIndicator; 
      if ((offsetIndicator=lseek(transport_fd, offset, SEEK_CUR))<0) 
       printf("Error seeking\n"); 
      nanosleep(&nano_sleep_packet, 0); //Try to sleep to see if it is still hanging, didn't work 
      seekLck = 0; 
     } 
     len = read(transport_fd, send_buf, packet_size); 
     if(len < 0) { 
      fprintf(stderr, "File read error \n"); 
      completed = 1; 
     } 
     else if (len == 0) 
     { 
      fprintf(stderr, "Sent done\n"); 
      completed = 1; 
     } 
     else 
     { 
      sent = sendto(sockfdstr, send_buf, len, 0, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)); 
      if(sent <= 0) 
      { 
       perror("send(): error "); 
       completed = 1; 
      } 
     } 
    } 
    nanosleep(&nano_sleep_packet, 0); 
} 
close(transport_fd); 
close(sockfdstr); 
free(send_buf); 
printf("cleaning up\n"); 
return 0; 
} 
+0

(Не эксперт, но ...) Чтение страницы man для lseek, при сбое, оно должно заполнять 'errno'. См. Страницу [lseek # errors man] (http://man7.org/linux/man-pages/man2/lseek.2.html#ERRORS) и [errno manpage] (http://man7.org/linux/man -pages/man3/errno.3.html). Это может привести к дополнительной информации. – wmorrison365

+0

Нет ошибок при поиске, и из моего кода он должен печатать сообщение об ошибке, я проверил позицию указателя после поиска, и это было точно, но поток повесился, поэтому я ищу мнение о том, что может быть пошло не так в там! – Ash

+0

Характер вашей проблемы определенно специфичен для вашей реализации сервера, а может быть, и для реализации вашего клиента. 'Lseek()' вряд ли сам по себе будет проблемой. Вы не дали нам ничего, с чем мы можем работать. –

ответ

0

Основной вопрос: "Почему не файл в виде потока (Сыграл), даже когда lseek() работает нормально?" ...

На самом деле ничего не случилось с серверной стороны, но даже при том, что клиенты не смогли продолжить потоковое вещание после потери количества кадров (потоковая передача кадров ffmpeg, клиенты получают поток из видео скремблера).

То, что сработало для меня в этой ситуации, - это получить параметр сокета и убить (в чистом виде) процесс, который нужно искать, удерживая позицию потока, после чего начнется совершенно новый поток из позиции поиска с тот же параметр сокета, чтобы он заменил старый.

Я надеюсь, что это поможет кому-то, особенно там, что нет никакой документации по этим материалам.

Смежные вопросы