TX2之硬件解码RTSP转RTMP

参考:https://gist.github.com/Brainiarc7/7b6049aac3145927ae1cfeafc8f682c1

参考:https://developer.nvidia.com/ffmpeg

1 目标

用TX2做硬件解码,实时获取相机rtsp视频,解码后转为rtmp推流到服务器,本文介绍用到的两种方法,分别是FFmpeg指令和GStreamer指令,哪种效果好,需要再比较一下

2 FFmpeg指令格式

ffmpeg [input-options] -i [input-file] [output-options] [output-stream-URI]
//[input-options] apply to the input, or source, file. For example, you can use -s to specify the size of the file.
//[input-file] is the video file or the stream URL.
//[output-options] apply to the output, or destination. For example, the -f option specifies the output container format.  
//[output-stream-URI] is the destination stream URI. The format of the URI depends on the output container format.

当输出是rtmp码流时,输出格式如下

rtmp://[wowza-ip-address]:1935/[application]/[stream-name]
//[wowza-ip-address] is the IP address of your Wowza Streaming Engine server.
//[application] is the name of your Wowza Streaming Engine application (such as live or vod).
//[stream-name] is the name of the stream in the Wowza Streaming Engine application.

2.1 主要参数

使用 ffmpeg -help 可以输出每个选项的含义,这里选取主要的几个选项进行介绍

-i——设置输入档名。
-f——设置输出格式。
-y——若输出文件已存在时则覆盖文件。
-fs——超过指定的文件大小时则结束转换。
-t——指定输出文件的持续时间,以秒为单位。
-ss——从指定时间开始转换,以秒为单位。
-t从-ss时间开始转换(如-ss 00:00:01.00 -t 00:00:10.00即从00:00:01.00开始到00:00:11.00)。
-title——设置标题。
-timestamp——设置时间戳。
-vsync——增减Frame使影音同步。
-c——指定输出文件的编码。
-metadata——更改输出文件的元数据。
-help——查看帮助信息。

2.2 视频参数

-b:v——设置视频流量,默认为200Kbit/秒。(单位请引用下方注意事项)
-r——设置帧率值,默认为25。
-s——设置画面的宽与高。
-aspect——设置画面的比例。
-vn——不处理视频,于仅针对声音做处理时使用。
-vcodec( -c:v )——设置视频视频编解码器,未设置时则使用与输入文件相同之编解码器。

2.3 声音参数

-b:a——设置每Channel(最近的SVN版为所有Channel的总合)的流量。(单位请引用下方注意事项)
-ar——设置采样率。
-ac——设置声音的Channel数。
-acodec ( -c:a ) ——设置声音编解码器,未设置时与视频相同,使用与输入文件相同之编解码器。
-an——不处理声音,于仅针对视频做处理时使用。
-vol——设置音量大小,256为标准音量。(要设置成两倍音量时则输入512,依此类推。)

2.4 示例

ffmpeg -rtsp_transport tcp -i "rtsp://192.168.1.153:554/user=admin&password=&channel=1&stream=0.sdp?" -f flv -r 25 -s 640x480 -an "rtmp://123.124.17.233:1935/mylive/node1"

为了测试nvidia的NVDEC硬件解码模块,首先运行以下的测试命令行

ffmpeg -y -hwaccel cuvid -c:v h264_cuvid -vsync 0 -i input.mp4 -vf scale_npp=1920:1072
-vcodec h264_nvenc output0.264 -vf scale_npp=1280:720 -vcodec h264_nvenc output1.264

使用FFmpeg测试没有成功,在查找资料的过程中,发现GStreamer也有RTSP转RTMP的功能,在之前的文章中,介绍过使用GStreamer做TX2视频的硬解码,因此如果能继续使用GStreamer做转换和推送,就可以达到所需目的。

2 GStreamer指令

关于GStreamer的详细介绍,参考另一篇文章《GStreamer功能详解》,公司内部可用的网络rtsp码流地址为

rtsp://10.9.4.7:554/2100001201000004.live

然后利用GStreamer构建一条管道,将rtsp码流进行解码推流,指令如下

gst-launch-1.0 rtspsrc location="rtsp://10.9.4.7:554/2100001201000004.live" ! rtph264depay ! h264parse ! queue ! flvmux ! rtmpsink location='rtmp://10.1.1.101:1935/mylive/node1'

其中:

  • rtspsrc:表示连接rtsp服务器,并获取RTP包,所有行为遵守RFC2326,使用location属性来指定码流地址
  • rtph264depay:表示从RTP报中解出H264包,所有行为遵守RFC3984
  • h264parse:解析H264流,输出数据为AU对齐的流
  • queue:进行数据的缓存
  • flvmux:FLV muxer 将解码后的H264封装为flv格式的数据
  • rtmpsink:把flv数据转换为rtmp流,并传送给rtmp服务器,使用location属性来指定服务器码流地址

测试后运行 htop 发现CPU并没有增加,因此起到了硬解码的效果!

你可能感兴趣的:(TX2)