Как сохранить видеопоток RTSP в файл MP4 через gstreamer?

Мне нужно получить видеопоток с моей камеры через RTSP и сохранить его в файл. Все это нужно сделать через gstreamer.

После некоторого поиска в Google я попробовал следующее:

gst-launch-1.0 rtspsrc location=rtsp://192.168.1.184/live2.sdp ! queue ! rtph264depay ! avdec_h264 ! mp4mux ! filesink location=result3.mp4

но выдает ошибку: "Ошибочный конвейер: не удалось связать avdec_h264-0 с mp4mux0"

gst-launch-1.0 rtspsrc location=rtsp://192.168.1.184/live2.sdp ! queue ! rtph264depay ! h264parse ! mp4mux ! filesink location=result3.mp4

Он начинает работать, но файл результатов не воспроизводится через VLC.

Какую команду сделать правильно? И если вы выбираете между h264parse и avdec_h264, не могли бы вы объяснить, почему?

3 ответа

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

 gst-launch -e rtspsrc location=url ! decodebin ! x264enc ! mp4mux ! filesink location=file.mp4

Если ваш поток rtspsrc уже закодирован в H264, просто напишите непосредственно в контейнер mp4 вместо выполнения процесса кодека.

Вот моя команда gst-launch-1.0 для записи rtsp в mp4:

$ gst-launch-1.0 -e rtspsrc location=rtsp://admin:pass@192.168.85.7/rtsph2641080p protocols=tcp ! rtph264depay ! h264parse ! mp4mux ! filesink location=~/camera.mp4

Если вы хотите что-то сделать, например, изменить ширину, высоту (с использованием видеомасштабов), цветовое пространство (с помощью видеоконвертации), частоту кадров (с помощью capsfilter) и т. Д., Что следует делать в зависимости от возможностей типа video/x-raw, вам следует выполнить декодирование из видео. /x-h264 для видео /x-raw.

И, после изменения, вы должны снова кодировать перед связыванием с элементом mux (например, mp4mux, mpegtsmux, matroskamux, ...).

Кажется, вы не уверены, когда использовать видео декодер. Здесь просто поделимся опытом использования видеокодека:

  1. Если источник был закодирован, и я хочу записать в контейнер с тем же кодированием, то конвейер будет выглядеть так:

    src ! ... ! mux ! filesink

  2. Если источник был закодирован, и я хочу записать в контейнер с другим кодированием, или я хочу поиграть с видеосинкером, то конвейер будет выглядеть так:

    src ! decode ! ... ! encode ! mux ! filesink src ! decode ! ... ! videosink

  3. Если источник не был закодирован (как, например, videotestsrc), и я хочу записать в контейнер, то конвейеру будет нравиться:

    src ! encode ! mux ! filesink

Примечание: это требует больших ресурсов процессора при выполнении кодека! Так что, если вам не нужно работать с кодеками, не делайте этого.

Вы можете проверить элементы src, sink, mux, demux, enc, dec, convert, ... и т. Д., Используя удобный инструмент gst-inspect-1.0. Например:

$ gst-inspect-1.0 | grep mux

показать все доступные элементы мультиплексора.

Вторая команда выглядит правильно. Необработанные видеоданные h264 немного сложны, поскольку имеют две характеристики -"выравнивание" и "формат потока", которые могут различаться. h264parse может преобразовывать данные h264 в форму, необходимую для различных элементов GStreamer, связанных с h264.

avdec_h264 является элементом декодера. Вы не хотите декодировать данные, так как вы явно их не отображаете. Вы помещаете закодированные данные h264 из потока RTSP в файл контейнера mp4.

Если файл не воспроизводится, вы должны убедиться, что поток работает нормально, или попробовать другие медиаплееры и посмотреть, работают ли они (mplayer, Media Player, Quicktime и т. Д.).

Вы также можете попробовать выполнить мультиплексирование в файл контейнера matroska с помощью элемента "matroskamux".

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