設想

設想

設想

我正在嘗試使用 RTP 在 2 個主機之間傳輸視訊。我之前已經使用 VLC 使用以下 2 個命令解決了這個問題

伺服器端

cvlc video_file.mp4 --sout "#transcode{vcodec=h264, acodec=mpga, ab=128, channels=2, samplerate=44100}: duplicate{dst=rtp{dst=10.X.X.X, port=5004, mux=ts}}" --run-time 40 vlc://quit

客戶端

cvlc rtp://@:5004 --sout "#transcode{vcodec=h264, acodec=mpga, ab=128, channels=2, samplerate=44100}: std{access=file, mux=mp4, dst=downloaded.mp4}" --run-time 40 vlc://quit

要求

現在我想用 FFMPEG 實現同樣的目標。等效的命令是什麼?

到現在為止工作已經完成

伺服器端

ffmpeg -re -i video_file.mp4 -vcodec libx264 -an -f rtp rtp://10.X.X.X:5004 -vn -acodec libtwolame -f rtp rtp://10.X.X.X:5005

客戶端

ffmpeg -i rtp://10.X.X.X:5004 -vcodec libx264 -an -i rtp://10.5.19.244:5005 -acodec libtwolame -vn -t 00:00:35 downloaded.mp4

但是,我無法以這種方式記錄接收到的流。

答案1

假設客戶端的IP為10.0.0.2

在伺服器端運行的程式碼

ffmpeg -re -thread_queue_size 4 -i source_video_file.mp4 -strict 2 -vcodec copy -an -f rtp rtp://10.0.0.2:6005 -acodec copy -vn -sdp_file saved_sdp_file -f rtp rtp://10.0.0.2:7005

運行此程式碼後,應產生一個名為 .sdp 的 SDP 檔案saved_sdp_file。這應該傳輸到客戶端,客戶端需要它來接收流

在客戶端運行的程式碼

ffmpeg -protocol_whitelist "file,rtp,udp" -i saved_sdp_file -strict 2 saved_video_file.mp4

答案2

考慮伺服器位址為 10.158.210.39 並在 UDP 連接埠 5155 上進行串流傳輸

伺服器端:

ffmpeg -re -i test_video.mp4 -c:v copy -c:a copy -f rtp_mpegts -sdp_file test_video.sdp "rtp://10.158.210.39:5155"

rtp_mpegts是 VLC 也支援的格式。無需複製sdp文件發送到客戶端以接收流。

客戶端:

ffmpeg -protocol_whitelist rtp,udp -i "rtp://10.158.210.39:5155" save.mp4

接收到的流保存到保存.mp4

使用 ffplay 接收:

ffplay -protocol_whitelist rtp,udp -i "rtp://10.158.210.39:5155"

這將播放影片(即使在 SSH 連線中,如果您使用的是 mobaxterm)

相關內容