Вопрос или проблема
Во время попытки записать RTSP поток, я заметил, что ffmpeg записывает только до 30 секунд, а затем просто зависает. Я нажимаю Ctrl + C
, чтобы завершить.
Я использую ffmpeg версии 2.5.2
antony@medina:~$ ffmpeg -i rtsp://192.168.0.112:554/11 -vcodec copy ~/test.mp4
ffmpeg версия 2.5.2 Copyright (c) 2000-2014 разработчиков FFmpeg
собран 25 дек 2014 00:04:42 с помощью gcc 4.8 (Ubuntu 4.8.2-19ubuntu1)
конфигурация: --extra-libs=-ldl --prefix=/opt/ffmpeg --enable-avresample --disable-debug --enable-nonfree --enable-gpl --enable-version3 --enable-libpulse --enable-libopencore-amrnb --enable-libopencore-amrwb --disable-decoder=amrnb --disable-decoder=amrwb --enable-libx264 --enable-libx265 --enable-libfdk-aac --enable-libvorbis --enable-libmp3lame --enable-libopus --enable-libvpx --enable-libspeex --enable-libass --enable-avisynth --enable-libsoxr --enable-libxvid --enable-libvo-aacenc
libavutil 54. 15.100 / 54. 15.100
libavcodec 56. 13.100 / 56. 13.100
libavformat 56. 15.102 / 56. 15.102
libavdevice 56. 3.100 / 56. 3.100
libavfilter 5. 2.103 / 5. 2.103
libavresample 2. 1. 0 / 2. 1. 0
libswscale 3. 1.101 / 3. 1.101
libswresample 1. 1.100 / 1. 1.100
libpostproc 53. 3.100 / 53. 3.100
Предполагаемая компоновка канала для входного потока #0.1: моно
Вход #0, rtsp, из 'rtsp://192.168.0.112:554/11':
Метаданные:
заголовок : \11
Длительность: N/A, начало: 0.039900, битрейт: 64 кбит/с
Поток #0:0: Видео: h264 (Main), yuv420p, 1280x720, 25.08 tbr, 90k tbn, 180k tbc
Поток #0:1: Аудио: pcm_alaw, 8000 Гц, 1 канал, s16, 64 кбит/с
Выход #0, mp4, в '/home/antony/test.mp4':
Метаданные:
заголовок : \11
кодировщик : Lavf56.15.102
Поток #0:0: Видео: h264 ([33][0][0][0] / 0x0021), yuv420p, 1280x720, q=2-31, 90k tbn, 90k tbc
Поток #0:1: Аудио: aac (libfdk_aac) ([64][0][0][0] / 0x0040), 8000 Гц, моно, s16, 17 кбит/с
Метаданные:
кодировщик : Lavc56.13.100 libfdk_aac
Сопоставление потоков:
Поток #0:0 -> #0:0 (копировать)
Поток #0:1 -> #0:1 (pcm_alaw (родной) -> aac (libfdk_aac))
Нажмите [q], чтобы остановить, [?] для справки
[mp4 @ 0x343c1e0] Некомпактный DTS в выходном потоке 0:0; предыдущее: 0, текущее: 0; изменение на 1. Это может привести к неправильным временным меткам в выходном файле.
[NULL @ 0x31cf840] RTP: пропущено 8 пакетовkB время=00:00:02.59 битрейт=1084.8kbits/s
^Cav_interleaved_write_frame(): Запрошен немедленный выход.56 битрейт=1492.1kbits/s
frame= 751 fps=9.5 q=-1.0 Lsize= 5415kB time=00:00:29.88 битрейт=1484.3kbits/s
видео:5449kB аудио:64kB субтитры:0kB другие потоки:0kB глобальные заголовки:0kB накладные расходы мультиплексирования: неизвестно
Получен сигнал 2: завершение.
Оказывается, для этого необходим следующий переключатель -rtsp_transport tcp
ffmpeg -rtsp_transport tcp -i rtsp://192.168.0.112:554/11 ~/Videos/stream.mkv
Ответ или решение
Решение проблемы с захватом RTSP-потока в FFmpeg
Введение
При использовании FFmpeg для записи RTSP-потоков вы столкнулись с проблемой: запись продолжается только 30 секунд, после чего процесс зависает. Это может вызвать неудобства и затруднения при использовании инструмента. В данном материале мы исчерпывающе рассмотрим возможные причины данной проблемы и подходы к её устранению.
Суть проблемы
Согласно вашему описанию, вы пытаетесь записать поток с помощью следующей команды:
ffmpeg -i rtsp://192.168.0.112:554/11 -vcodec copy ~/test.mp4
Однако, спустя 30 секунд процесс останавливается из-за зависания. Версия FFmpeg, которую вы используете, — 2.5.2, что может быть важным фактором, так как вы используете довольно старую версию программы.
Актуальные факторы
-
Проблемы с сетью: RTSP-протокол использует UDP по умолчанию, который не гарантирует доставку пакетов. Упущенные кадры могут вызвать проблемы с синхронизацией потоков.
-
Версия FFmpeg: Ваша версия FFmpeg устарела. Постоянные обновления и улучшения в более новых версиях могут влиять на успешную обработку потоков.
-
Параметры кодирования: Использованные вами параметры могут быть не оптимальными. Тысячи пользователей сообщают о проблемах при работе с неподходящими кодеками для некоторых источников.
-
Качество исходного потока: Иногда сам поток RTSP может иметь нестабильное качество, что может привести к зависаниям.
Решение
На основании вашего упоминания о использовании параметра -rtsp_transport tcp
, это очень вероятное решение вашей проблемы. TCP обеспечивает более стабильный и надежный транспортный уровень по сравнению с UDP, что в свою очередь уменьшает риск потери пакетов и зависаний.
Попробуйте выполнить команду с использованием данного параметра:
ffmpeg -rtsp_transport tcp -i rtsp://192.168.0.112:554/11 ~/Videos/stream.mkv
Этот метод может существенно улучшить стабильность процесса записи, особенно если у вас ограниченная пропускная способность сети.
Рекомендации по улучшению
-
Апгрейд FFmpeg: Рассмотрите возможность обновления вашей версии FFmpeg до последней стабильной версии, так как новые версии часто содержат исправления ошибок и улучшения производительности.
-
Мониторинг состояния сети: Используйте средства для мониторинга сети, чтобы удостовериться в отсутствии потерь пакетов. Это может помочь в выявлении проблем с качеством потока.
-
Эксперименты с кодеками: Попробуйте разные комбинации кодеков и форматов выходного файла, чтобы определить, какой из них лучше подходит для вашего потока.
-
Логи FFmpeg: Включите более детализированное логирование, добавив
-loglevel debug
, чтобы получить больше информации о том, что происходит в момент зависания.
Заключение
Проблема с зависанием FFmpeg при записи RTSP-потоков может быть решена с помощью параметра -rtsp_transport tcp
, что обеспечит более надежное и стабильное соединение. С учетом вышеприведенных рекомендаций вы сможете не только устранить проблему, но и оптимизировать процессы записи. Не забывайте обновлять свои инструменты и следить за состоянием сети для достижения наилучших результатов.
Надеюсь, данное руководство окажется полезным и поможет вам успешно захватывать RTSP-потоки без зависаний.