Замечания по разработке FFmpeg (33) Анализ операции вставки кадра ZLMediaKit для потоков H.264.
Замечания по разработке FFmpeg (33) Анализ операции вставки кадра ZLMediaKit для потоков H.264.

«3.4.3 Инкапсуляция исходных файлов H264 в формат MP4» в книге «Практика разработки FFmpeg: от нулевых основ к короткому видео в Интернете» рассказывает, как инкапсулировать голые потоки H.264 в файлы MP4. Так как же голый поток H.264, передаваемый по сети, получает видеоформат на принимающей стороне? В предыдущей статье указывалось, что поток H.264 должен начинаться с «Кадр SPS → Кадр PPS → Кадр IDR». Далее давайте проверим, действительно ли это так.

Здесь используется анализатор H264, написанный Лэй Сяохуа и Лэй Шеном. Хочу отдать должное Лэй Шену. Небольшая программа, написанная Лэй Шеном 10 лет назад, до сих пор проста в использовании. Откройте анализатор H264. Начальный интерфейс программного обеспечения показан ниже:

Нажмите кнопку «Открыть» в правой части панели пути к файлу, выберите файл чистого потока H.264 во всплывающем диалоговом окне файла, а затем нажмите кнопку «Пуск» в правом нижнем углу интерфейса. Запустится анализатор. для анализа формата содержимого файла H264. После анализа Интерфейс результатов показан ниже:

Из результатов анализа видно, что первые три кадра голого потока H.264 действительно представляют собой «кадр SPS → кадр PPS → кадр IDR». Щелкните кадр в списке, и подробная информация о поле кадра отобразится в правой части интерфейса.

Конечно, анализатор может читать только файлы чистого потока H.264. Если анализатору будет предложено прочитать файл MP4, он не сможет нормально прочитать информацию каждого кадра. Так как же сервер потоковой передачи преобразует файлы MP4 в чистые потоки H.264? Если взять в качестве примера ZLMediaKit, он выполняет специальную обработку при вставке I-кадров в последовательность отправки. Как только появляется I-кадр, он автоматически вставляет кадры конфигурации, такие как SPS и PPS. Конкретный код находится в ext-codec/H264.cpp платформы ZLMediaKit. Проверьте функцию H264Track::inputFrame_l исходного кода и найдите следующий фрагмент кода. Видно, что программа вызывает функцию InsertConfigFrame после оценки ключа. рамка.

Язык кода:javascript
копировать
// Определите, является ли это I-кадром, И если да, то определите, был ли ранее вставлен конфиг-фрейм, Если он был вставлен ранее, он не будет вставлен снова.
if (frame->keyFrame() && !_latest_is_config_frame) {
    insertConfigFrame(frame); // Вставка кадров SPS и кадров PPS
}
if(!frame->dropAble()){
    _latest_is_config_frame = false;
}
ret = VideoTrack::inputFrame(frame);

Найдите код определения функции InsertConfigFrame следующим образом. Конечно же, содержимое функции последовательно вставляет кадр SPS и кадр PPS:

Язык кода:javascript
копировать
// Вставка кадров SPS и кадров PPS
void H264Track::insertConfigFrame(const Frame::Ptr &frame) {
    if (!_sps.empty()) { // Вставить рамку SPS
        auto spsFrame = FrameImp::create<H264Frame>();
        spsFrame->_prefix_size = 4;
        spsFrame->_buffer.assign("\x00\x00\x00\x01", 4);
        spsFrame->_buffer.append(_sps);
        spsFrame->_dts = frame->dts();
        spsFrame->setIndex(frame->getIndex());
        VideoTrack::inputFrame(spsFrame);
    }
    if (!_pps.empty()) { // Вставить рамку PPS
        auto ppsFrame = FrameImp::create<H264Frame>();
        ppsFrame->_prefix_size = 4;
        ppsFrame->_buffer.assign("\x00\x00\x00\x01", 4);
        ppsFrame->_buffer.append(_pps);
        ppsFrame->_dts = frame->dts();
        ppsFrame->setIndex(frame->getIndex());
        VideoTrack::inputFrame(ppsFrame);
    }
}

Видно, что ZLMediaKit вставляет дополнительные кадры SPS и кадры PPS перед каждым ключевым кадром, чтобы гарантировать, что голый поток H.264 поддерживает формирование «кадр SPS → кадр PPS → кадр IDR». Если SPS и PPS не добавлены, клиент сообщит о следующей ошибке при получении потоков:

Язык кода:javascript
копировать
[NULL @ 0000022ed7782540] non-existing PPS 0 referenced

Только с добавлением SPS и PPS клиент может нормально извлекать и анализировать данные, а также нормально рендерить видеоизображения.  更多详细的FFmpegИнформацию о разработке см.«Практика разработки FFmpeg: от нулевых основ к короткому онлайн-видео»книга。

boy illustration
Учебное пособие по Jetpack Compose для начинающих, базовые элементы управления и макет
boy illustration
Код js веб-страницы, фон частицы, код спецэффектов
boy illustration
【новый! Суперподробное】Полное руководство по свойствам компонентов Figma.
boy illustration
🎉Обязательно к прочтению новичкам: полное руководство по написанию мини-программ WeChat с использованием программного обеспечения Cursor.
boy illustration
[Забавный проект Docker] VoceChat — еще одно приложение для мгновенного чата (IM)! Может быть встроен в любую веб-страницу!
boy illustration
Как реализовать переход по странице в HTML (html переходит на указанную страницу)
boy illustration
Как решить проблему зависания и низкой скорости при установке зависимостей с помощью npm. Существуют ли доступные источники npm, которые могут решить эту проблему?
boy illustration
Серия From Zero to Fun: Uni-App WeChat Payment Practice WeChat авторизует вход в систему и украшает страницу заказа, создает интерфейс заказа и инициирует запрос заказа
boy illustration
Серия uni-app: uni.navigateЧтобы передать скачок значения
boy illustration
Апплет WeChat настраивает верхнюю панель навигации и адаптируется к различным моделям.
boy illustration
JS-время конвертации
boy illustration
Обеспечьте бесперебойную работу ChromeDriver 125: советы по решению проблемы chromedriver.exe не найдены
boy illustration
Поле комментария, щелчок мышью, специальные эффекты, js-код
boy illustration
Объект массива перемещения объекта JS
boy illustration
Как открыть разрешение на позиционирование апплета WeChat_Как использовать WeChat для определения местонахождения друзей
boy illustration
Я даю вам два набора из 18 простых в использовании фонов холста Power BI, так что вам больше не придется возиться с цветами!
boy illustration
Получить текущее время в js_Как динамически отображать дату и время в js
boy illustration
Вам необходимо изучить сочетания клавиш vsCode для форматирования и организации кода, чтобы вам больше не приходилось настраивать формат вручную.
boy illustration
У ChatGPT большое обновление. Всего за 45 минут пресс-конференция показывает, что OpenAI сделал еще один шаг вперед.
boy illustration
Copilot облачной разработки — упрощение разработки
boy illustration
Микросборка xChatGPT с низким кодом, создание апплета чат-бота с искусственным интеллектом за пять шагов
boy illustration
CUDA Out of Memory: идеальное решение проблемы нехватки памяти CUDA
boy illustration
Анализ кластеризации отдельных ячеек, который должен освоить каждый&MarkerгенетическийВизуализация
boy illustration
vLLM: мощный инструмент для ускорения вывода ИИ
boy illustration
CodeGeeX: мощный инструмент генерации кода искусственного интеллекта, который можно использовать бесплатно в дополнение к второму пилоту.
boy illustration
Машинное обучение Реальный бой LightGBM + настройка параметров случайного поиска: точность 96,67%
boy illustration
Бесшовная интеграция, мгновенный интеллект [1]: платформа больших моделей Dify-LLM, интеграция без кодирования и встраивание в сторонние системы, более 42 тысяч звезд, чтобы стать свидетелями эксклюзивных интеллектуальных решений.
boy illustration
LM Studio для создания локальных больших моделей
boy illustration
Как определить количество слоев и нейронов скрытых слоев нейронной сети?
boy illustration
[Отслеживание целей] Подробное объяснение ByteTrack и детали кода