Лучшая практика потоковых движков в C

LANG: C / ENV: Linux

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

Используя функцию 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");

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

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

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

РЕДАКТИРОВАТЬ:

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

КОД СНИПЕТТ:

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;
}

1 ответ

Решение

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

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

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

Я надеюсь, что это поможет кому-то там, особенно в том, что нет большого количества документации об этих вещах.

Другие вопросы по тегам