如何使用FFMPEG/FFPLAY读取GStreamer生成的RTP流?
能否用FFmpeg/FFplay读取GStreamer生成的H.264 RTP流?
用户通过GStreamer生成模拟无人机的RTP流,命令如下:
gst-launch-1.0.exe filesrc location=./Bomb_Detection_long.mp4 ! decodebin ! x264enc ! h264parse ! queue ! rtph264pay config-interval=10 pt=96 ! udpsink host=localhost port=5600
该流无法修改,用户尝试用以下FFplay命令读取但失败:
ffplay -f rawvideo -vcodec h264 -pixel_format yuv420p -framerate 30 -video_size 1280x720 rtp://localhost:5600
更换h264_qsv、libopenh264等解码器仍无效果,但可通过GStreamer命令正常读取:
udpsrc port=5600 ! application/x-rtp, payload=96 ! rtph264depay ! h264parse ! avdec_h264 ! decodebin ! videoflip method=rotate-180 ! videoconvert ! video/x-raw,format=(string)BGR ! videoconvert ! appsink emit-signals=true sync=false max-buffers=2 drop=true
源视频的ffprobe信息:
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '.\Bomb_Detection_long.mp4': Duration: 00:04:44.20, start: 0.000000, bitrate: 4421 kb/s Stream #0:0[0x1](und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p(progressive), 1280x720, 4222 kb/s, 30 fps, 30 tbr, 15360 tbn (default) Metadata: handler_name : VideoHandler vendor_id : [0][0][0][0] Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 191 kb/s (default) Metadata: handler_name : SoundHandler vendor_id : [0][0][0][0]
当然可以用FFmpeg/FFplay读取这个RTP流,你之前的命令错误在于把RTP封装的H.264流当成了原始裸视频流处理。
正确的FFplay命令
直接指定协议并让FFplay自动识别流参数:
ffplay -protocol_whitelist "file,udp,rtp" -i rtp://localhost:5600
如果自动识别失败,可以手动指定格式和编码:
ffplay -protocol_whitelist "file,udp,rtp" -f rtp -codec:v h264 rtp://localhost:5600
用FFmpeg保存流到本地
如果需要把流保存为文件,使用以下命令:
ffmpeg -protocol_whitelist "file,udp,rtp" -i rtp://localhost:5600 -c copy output.mp4
错误原因说明
- 你之前用
-f rawvideo参数,强制FFplay读取无封装的原始视频帧,但实际GStreamer发送的是带RTP协议封装的H.264码流,必须先解析RTP协议才能解码H.264内容。 rtph264pay生成的是标准RTP封装的H.264流,FFmpeg/FFplay原生支持解析这类流,只要命令参数正确即可。
内容的提问来源于stack exchange,提问作者fc0001
相关产品推荐
相关产品推荐

