win10环境下 FFMPEG + VLC 推送/播放rtp流

一、环境准备
1、安装FFMPEG
https://www.gyan.dev/ffmpeg/builds/ffmpeg-git-full.7z
解压并将目录配置到环境变量

2、安装VLC
https://www.videolan.org/vlc/download-windows.zh.html
https://www.videolan.org/vlc/index.zh.html

3、下载音视频测试文件(mp4格式)
https://sample-videos.com/index.php#sample-mp4-video


二、FFMPEG推rtp流
注意事项:
(1)RFC3551协议中规定,rtp数据使用偶数端口,对应的RTCP数据使用下一个端口(奇数端口)。
https://tools.ietf.org/html/rfc3551#section-8
(2)命令行如果用重定向方式("> audio_video.sdp")存储sdp文件,第一行会包含"SDP:"需删除该行。
用命令"-sdp_file audio_video.sdp"存储sdp文件不需要做改动。
(3)FFMPEG不支持RTP多路复用,RTP muxer只支持单个流推送,因此音频和视频流是单独推送的。
在推送时需加上-an或-vn,否则会报如下错误:
[rtp @ 000002ad61675e40] Only one stream supported in the RTP muxer
(4)音频和视频分别使用不同的端口(偶数),如果使用同一端口,只会传输第一条流。

推送音频命令
D:\abcd\Desktop>ffmpeg -re -i SampleVideo_1280x720_30mb.mp4 -vn -acodec copy -f rtp rtp://127.0.0.1:11990 -sdp_file audio.sdp

推送视频命令
D:\abcd\Desktop>ffmpeg -re -i SampleVideo_1280x720_30mb.mp4 -vcodec libx264 -an -f rtp rtp://127.0.0.1:11992 -sdp_file video.sdp

推送音视频命令
D:\abcd\Desktop>ffmpeg -re -i SampleVideo_1280x720_30mb.mp4 -vn -acodec copy -f rtp rtp://127.0.0.1:11990 -vcodec libx264 -an -f rtp rtp://127.0.0.1:11992 -sdp_file audio_video.sdp
其中:
  -re 表示实时推送,不加的话就是按照最大速度推送.
  -an 表示不推音频
  -vn 表示不推视频

三、VLC拉流
打开VLC -> 媒体 -> 打开多个文件 -> 文件 -> 添加(选择sdp文件)-> 播放

四、注意
最初是在Linux服务器上搭建该环境,由于Linux服务器无法运行vlc客户端,需要在window上运行vlc。
此时如何设置rtp地址是一个问题。
如何使用Linux服务器的IP,ffmpeg推流地址中对应的端口并没有打开,因此vlc无法连接rtp地址。
如果使用window服务器的IP,ffmpeg无法推流成功(Linux服务器无法访问我的window机器)。


参考:
https://www.kurento.org/blog/rtp-ii-streaming-ffmpeg
https://blog.csdn.net/cdnight/article/details/107248942
 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
在Spring Boot中使用FFmpeg推送数据,你可以按照以下步骤进行操作: 1. 首先,确保你已经在Spring Boot项目中添加了必要的依赖,包括FFmpeg的Java绑定库。你可以使用Xuggler或JFFmpeg这样的库来实现。 2. 在你的Spring Boot应用程序中创建一个控制器或服务,用于处理推送数据的请求。你可以使用@RestController注解来定义一个控制器,并在其中定义一个端点来处理请求。 3. 在处理请求的方法中,使用FFmpeg库来推送数据。你可以使用FFmpeg的命令行接口或直接使用其Java绑定库来执行相关操作。例如,你可以使用FFmpeg命令行参数 `-re` 以实时模式推送数据。 4. 将推送的数据返回给客户端。你可以使用Spring Boot的ResponseEntity类或其他适当的方式将数据返回给客户端。请确保响应的内容类型正确设置为相应的媒体类型。 下面是一个示例代码片段,展示了如何在Spring Boot中实现推送数据: ```java @RestController public class StreamController { @GetMapping("/stream") public ResponseEntity<StreamingResponseBody> stream() { // 获取数据,例如从文件或其他来源 InputStream inputStream = ...; // 设置响应头,指定媒体类型 HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); // 创建StreamingResponseBody来推送数据 StreamingResponseBody responseBody = outputStream -> { try { // 创建FFmpeg进程来推送数据 ProcessBuilder processBuilder = new ProcessBuilder( "ffmpeg", "-re", // 实时模式 "-i", "input.mp4", // 输入文件 "-f", "mpegts", // 输出格式 "udp://localhost:1234" // 输出地址 ); Process process = processBuilder.start(); // 从FFmpeg进程的输出中读取数据并写入响应 int bytesRead; byte[] buffer = new byte[4096]; while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); outputStream.flush(); } // 关闭FFmpeg进程 process.destroy(); } catch (Exception e) { e.printStackTrace(); } finally { inputStream.close(); } }; return new ResponseEntity<>(responseBody, headers, HttpStatus.OK); } } ``` 上述示例中的代码仅供参考,你需要根据你的实际需求进行适当调整和修改。同时请确保在使用FFmpeg时遵循相关许可证和法律规定。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值