Как сохранить видеопоток 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, ...).
Кажется, вы не уверены, когда использовать видео декодер. Здесь просто поделимся опытом использования видеокодека:
Если источник был закодирован, и я хочу записать в контейнер с тем же кодированием, то конвейер будет выглядеть так:
src ! ... ! mux ! filesink
Если источник был закодирован, и я хочу записать в контейнер с другим кодированием, или я хочу поиграть с видеосинкером, то конвейер будет выглядеть так:
src ! decode ! ... ! encode ! mux ! filesink src ! decode ! ... ! videosink
Если источник не был закодирован (как, например, 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".