标签: rtp

FFMPEG 流 RTP:未设置时基

我正在尝试创建一个小演示,以了解使用 ffmpeg 以编程方式流式传输的感觉。我正在使用这个问题中的代码作为基础。我可以编译我的代码,但是当我尝试运行它时,我总是收到此错误:

[rtp @ 0xbeb480] 未设置时基

问题是,我已经设置了时基参数。我什至尝试为流(以及与流关联的编解码器)设置它们,尽管据我所知这不是必需的。这是我的代码中的相关部分:

AVCodec* codec = avcodec_find_encoder(AV_CODEC_ID_H264);
AVCodecContext* c = avcodec_alloc_context3(codec);
c->pix_fmt = AV_PIX_FMT_YUV420P;
c->flags = CODEC_FLAG_GLOBAL_HEADER;
c->width = WIDTH;
c->height = HEIGHT;
c->time_base.den = FPS;
c->time_base.num = 1;
c->gop_size = FPS;
c->bit_rate = BITRATE;

avcodec_open2(c, codec, NULL);
struct AVStream* stream = avformat_new_stream(avctx, codec);

// TODO: causes an error
avformat_write_header(avctx, NULL);
Run Code Online (Sandbox Code Playgroud)

在接近末尾调用“avformat_write_header”时发生错误。检查所有可能失败的方法(如 avcodec_open2),我只是删除了检查以使代码更具可读性。

挖掘谷歌和 ffmpeg 源代码没有产生任何有用的结果。我认为这真的很基本,但我被卡住了。谁能帮我?

streaming ffmpeg rtp h.264

6
推荐指数
1
解决办法
6602
查看次数

在网络浏览器上使用gstreamer显示实时视频流

我正在尝试使用gstreamer在UDP打包中发送h264视频.就像,gstreamer v4l2src!video/x-raw-rgb,widht = 320,身高= 240!ffmpegcolorspace!x264enc!rtph264pay!udpsink host = 192.168.0.1 port = 12345
有人能告诉我如何在网络浏览器的接收方显示器上接收视频..?提前致谢..

PRA-双赢

browser rtp video-streaming gstreamer

6
推荐指数
0
解决办法
903
查看次数

使用 tcpserversink 通过 gstreamer 流式传输到 vlc

我正在尝试使用 gstreamer 和 tcp 流式传输 h264 编码的视频。命令是:

gst-launch-1.0 videotestsrc is-live=true !视频转换!视频尺度!视频/x-raw,宽度=800,高度=600!x264enc key-int-max=12 !rtph264pay 配置间隔=1 点=96 !国内生产总值支付!tcpserversink 端口=5000

gop 大小设置为 12,配置每秒发送一次。我无法使用 vlc 接收此流(无论是在同一台机器上还是在其他机器上)。vlc上的命令是:

vlc rtp://localhost:5000

但什么也没显示。任何人都可以帮忙吗?问候

tcp vlc rtp gstreamer

6
推荐指数
1
解决办法
8040
查看次数

从 OpenCV-Python 传输 RTP/RTSP 流时遇到问题

我正在尝试使用我在这里找到的示例脚本来获取 OpenCV 图像并将其转换为 rtp/rtsp 流:
https://github.com/madams1337/python-opencv-gstreamer-examples/blob/master/gst_device_to_rtp .py

这是脚本的描述:

“gst_device_to_rtp 抓取 VideoCapture(0),对帧进行编码并将其流式传输到 rtp://localhost:5000”

这是我尝试使用的代码

# Cam properties
fps = 30.
frame_width = 1920
frame_height = 1080
# Create capture

#cap = cv2.VideoCapture(0)

# Set camera properties
cap.set(cv2.CAP_PROP_FRAME_WIDTH, frame_width)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, frame_height)
cap.set(cv2.CAP_PROP_FPS, fps)

# Define the gstreamer sink
gst_str_rtp = "appsrc ! videoconvert ! x264enc noise-reduction=10000 tune=zerolatency byte-stream=true threads=4 " \
              " ! h264parse ! mpegtsmux ! rtpmp2tpay ! udpsink host=127.0.0.1 port=5000"

# Create videowriter as a SHM sink
out = cv2.VideoWriter(gst_str_rtp, …
Run Code Online (Sandbox Code Playgroud)

python streaming opencv rtp gstreamer

6
推荐指数
0
解决办法
3440
查看次数

如何通过 nodejs 进行 SIP 呼叫

我正在尝试向我的客户自动呼叫,我已经设置并运行了 freepbx,现在我希望能够触发一些 nodejs 代码来进行呼叫,获取音频流并将其传递给 dialogflow 并播放 MP3 (或任何其他音频类型)根据对话流响应发送给客户。

我试过这个包:

https://github.com/versatica/JsSIP

我可以稳定通话并获取音频流。是的,那太好了,如果不是在浏览器上的 html 中......但后来我发现了这个!

https://github.com/versatica/jssip-node-websocket

看起来像我所有问题的答案,直到我尝试从我的 nodejs 脚本中拨打电话,令人惊讶的是,它不起作用,甚至不打算工作,它只是用于发送 sip 信号,但无法拨打电话因为包在 WebRTC 上中继(Wich 只在浏览器上运行)

然后我发现了这个问题:

没有 WebRTC 的 nodeJS 中的简单 SIP 电话

提到了一些名为 sip 的包,我需要尝试一下,哇,这是纯粹的 sip 通信,我对此知之甚少,但是,经过大量工作后,我设法连接到我的 freepbx,进行身份验证并放置一个电话!!那时一切似乎都很好,但现在……音频在哪里?

正如我在大量阅读后了解到 sip 只发出呼叫,所有媒体传输都由 RTP 执行,但我的问题是,我该如何实现?我需要创建一些 RTP 媒体服务器来处理这个问题,或者我需要做什么?任何关于正确方向的帮助、澄清或指导将不胜感激,提前致谢,并为我的英语不好而道歉。

这是我当前的代码:

const sip = require('sip');
const util = require('util');
const digest = require('sip/digest');

const rstring = () => Math.floor(Math.random() * 1e6).toString();

sip.start({
  publicAddress: 'My public IP Address',
  tcp: false,
  logger: {
    send: (message, address) => {
      debugger; …
Run Code Online (Sandbox Code Playgroud)

sip rtp node.js webrtc dialogflow-es

6
推荐指数
1
解决办法
9609
查看次数

音频流:使用 Gstreamer 接收 RTP-Stream - 延迟

我目前正在研究一个 AudioOverIP 项目,想知道你是否可以帮助我。我有一个 LAN,带有一个音频源(Dante/AES67-RTP-Stream),我想将其分发到多个带有音频输出(例如耳机插孔)的接收器(SBC(例如 RaspberryPi)):

PC-->Audio-USB-Dongle-->AES67/RTP-Multicast-Stream-->LAN-Network-Switch-->RPI (Gstreamer --> AudioJack)
Run Code Online (Sandbox Code Playgroud)

我目前使用 Gstreamer 作为管道:

gst-launch-1.0 -v udpsrc uri=udp://239.69.xxx.xx:5004 caps="application/x-rtp,channels=(int)2,format=(string)S16LE,media=(string)audio,payload=(int)96,clock-rate=(int)48000,encoding-name=(string)L24" ! rtpL24depay ! audioconvert ! alsasink device=hw:0,0
Run Code Online (Sandbox Code Playgroud)

一切正常,但如果我在 PC 上观看视频并收听 RPI 的音频,我会出现一些延迟(~200-300ms),因此我的问题是:

  1. 我是否错过了 Gstreamer Pipeline 中的某些内容来减少延迟?
  2. RTP-Streams 的预期最小延迟是多少,可以实现 <50 毫秒吗?
  3. 延迟是由网络还是 RPi 的速度造成的?
  4. 由于我的音频输入不是 Gstreamer 输入,我认为rtpjitterbuffer或类似的输入不会有助于减少延迟?

rtp audio-streaming gstreamer dante

6
推荐指数
1
解决办法
1766
查看次数

用于摄像机的HTTP隧道(RTP)

我的公司正在开发一个与多个网络摄像头连接的系统.我们从摄像机流式传输视频的方式是通过HTTP(主要是因为摄像机的限制以及我们希望它能够提供即插即用的行为).我注意到当我使用rtp over http选项的流时,rtp流的方式是
| X | | RTP |
| -4 | | ------- |

其中X是一个4字节的标题,以hexa中的"24 00"开头,另外2个字节是RTP数据包的长度(之后是RTP数据包).

现在我不能为我的生活弄清楚X协议是什么.我已经在两个相机品牌中看到了同样的行为 - 松下和Edimax,这表明它不是某种专有协议.

有谁知道这是什么样的协议?也许是某种HTTP隧道协议?

谢谢,
Tomer

http rtp ip-camera http-tunneling

5
推荐指数
1
解决办法
1235
查看次数

FFmpeg RTP流错误

我想通过FFmpeg播放视频文件,但是我收到此错误:

RTP多路复用器中仅支持一个流

我写这篇文章时遇到错误:

ffmpeg.exe -i SomeVideo.mp4 -f rtp rtp://127.0.0.1:11111
Run Code Online (Sandbox Code Playgroud)

我不知道出了什么问题.

streaming ffmpeg live rtp

5
推荐指数
1
解决办法
1万
查看次数

如何将H.264 UDP数据包转换为可播放的媒体流或文件(碎片整理)

在将SDP会话的UDP流转换为可解码的H.264流时,我遗漏了一些基本的东西.我正在使用支持H.264的摄像头进行测试,可以直接与播放器一起播放流.当我尝试播放翻译的流时,播放器将无法识别(缺少标题错误).但是,我必须解码UDP流才能将其集成到Java应用程序中,其中有一些解码器.

我已经看到了以下问题的非常好的答案:

  1. 如何处理原始UDP数据包,以便它们可以通过directshow源过滤器中的解码器过滤器进行解码
  2. 使用ffmpeg(libavcodec)通过RTP解码H264视频的问题

两者都有一些令人困惑的小差异(见下文).

但首先让我们看看容易的部分.正如我从相机中看到的那样,发送了SPS和PPS数据包.所有剩余的数据包都是索引或未索引的碎片帧.

对于没有帧的所有数据包(在我的情况下只有NALUnitType 7和8)我剥离RTP报头(12字节)并在前面添加起始字节3 x 0字节和1 x 1(00 00 00 01).

对于所有分段的帧数据包,我根据答案1的描述重建它们.因此详细地说,这意味着:RTP报头的条带(仅用于数据验证).然后从有效载荷中解码片段信息:

第一个字节:[3 NAL UNIT BITS | 5碎片类型位]
第二个字节:[START BIT | 结束位| 保留位| 5个NAL单位]

如果设置了起始位,则会有一个新的有效负载头,如下所示:[3 NAL UNIT BITS(从第一个字节开始)| 5 NAL UNIT BITS(来自第二个字节)]
这为非idr切片提供了NALUnitType 1,为idr切片提供了5.这是根据规范.

我使用这个新的有效负载头(1个字节)并将没有2个字节头的有效负载附加到新的包中.以相同的方式添加所有连续片段(12字节RTP标题的条带,2字节单元类型信息的条带),直到看到结束位信息.当看到结束时,我将开始字节(00 00 00 01)放在此数据包的前面并将其写入流.

问题是由于未知原因无法解码.我读过的答案的答案2的不同之处在于,有效载荷头的第二个字节也可能被放入翻译的数据包中.但我尝试了两个,但仍然没有运气.

可能在新构建的流中还有其他缺失的东西?或者我在碎片整理中犯了错误?

java udp rtp h.264 sdp

5
推荐指数
1
解决办法
3594
查看次数

使用mp4v2将h264写入mp4容器的正确方法是什么?

我在编写从RTP数据包到MP4文件的h264帧时遇到了问题.视频播放(例如)命令avplay/ffplay,但我收到这些错误:  

[h264 @ 0x7faebc006d40] no frame!0KB vq=   79KB sq=    0B f=0/9
Run Code Online (Sandbox Code Playgroud)

当然,看起来有些帧错过了.我写数据包的方式如下:

  1. 等待NAL类型= 8(= SPS)和7(= PPS)的数据包,此时将传入数据包保留在列表中.
  2. 如果NAL类型是28,则意味着帧被分割 - 查找起始位和结束位,然后创建适当的NAL单元并将片段粘在一起.
  3. 如果我们找到了PPS和SPS表,那么创建MP4文件:

    char*application_name ="isom"; _mp4file = MP4CreateEx(name,0,1,1,application_name,1);

     然后创建VideoTrack:

     _video = MP4AddH264VideoTrack(_mp4file, _videoTimeScale, _videoTimeScale / _videoSampleDuration, _videoWidth, _videoHeight,
                                                _sps->getData()[1], //sps[1] AVCProfileIndication
                                                _sps->getData()[2], //sps[2] profile_compat
                                                _sps->getData()[3], //sps[3] AVCLevelIndication
    3); // 4 (minusOne) bytes length before each NAL unit 
    
    Run Code Online (Sandbox Code Playgroud)

    并设置一些东西:

    MP4SetVideoProfileLevel(_mp4file, 0x7F);
    MP4AddH264SequenceParameterSet(_mp4file, _video, _sps->getData(), _sps->getSize());
    MP4AddH264PictureParameterSet(_mp4file, _video, _pps->getData(), _pps->getSize());
    
    Run Code Online (Sandbox Code Playgroud)
  4. 从列表到文件刷新等待帧,在开头的Big Endian中添加了帧大小:

    MP4WriteSample(_mp4file, _video, waitingFrame->getDataWithNalSize(), waitingFrame->getSize(), MP4_INVALID_DURATION, 0, 1);
    Run Code Online (Sandbox Code Playgroud)
  5. 读取RTP数据包并将其写入循环到文件:
    MP4WriteSample(_mp4file, _video, …
    Run Code Online (Sandbox Code Playgroud)

video mp4 rtp h.264

5
推荐指数
1
解决办法
2397
查看次数