ffmpeg - 如何处理实时原始 h264 流以通过网络发送

标签 ffmpeg video-streaming gstreamer

我想要做的是将 h264 编码的实时摄像头流发送到 gstreamer。我已经见过很多使用 rtp 和 mpeg-ts 通过网络发送的示例。但问题是,所有这些示例都假设输入将由固定文件或实时流提供,这些文件或直播流已经在传输端口中进行了转码,如下所示。

客户: gst-launch-1.0 videotestsrc 水平速度=5 ! x264enc 调整=“零延迟”线程= 1 ! mpegtsmux! tcpserversink 主机=192.168.0.211 端口=8554

服务器:gst-launch-1.0 tcpclientsrc 端口=8554 主机=192.168.0.211 ! tsdemux! h264解析! avdec_h264! xvimagesink

但是,我的相机提供以下界面(用java编写,实际上在adnroid上工作)。该接口(interface)仅提供实时原始 h264 block 。

mReceivedVideoDataCallBack=newDJIReceivedVideoDataCallBack(){
    @Override
    public void onResult(byte[] videoBuffer, int size)
    {
}

我可以创建 tcp session 来发送这些数据 block 。但是,如何将那些未打包在传输协议(protocol)中的数据转换为 gstreamer tcpclient 不稳定的格式? 在相机端将原始流转码为ts格式可以是一个解决方案。但我不知道如何从非文件和非传输格式数据进行转码。我已经搜索了 gstreamer 和 ffmpeg,但我现在无法使用支持的接口(interface),unitl 导出处理 h264 block 流的方法。 或者,有没有办法让 gstreamer 直接接受那些简单的原始 h264 block ?

最佳答案

我认为最好的解决方案是为您的视频源创建您自己的元素,然后使用您的元素和 mpegtsmux 构建管道。

但是,您可以使用appsrc + mpegtsmux 并通过 JNI 使用回调中的缓冲区提供您的 appsrc。

关于ffmpeg - 如何处理实时原始 h264 流以通过网络发送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33492695/

相关文章:

android - 如何在 Android 中使用 JNI 将 Assets FileDescriptor 正确传递给 FFmpeg

FFMPEG:如何确定特定硬件加速上下文支持哪些过滤器?

linux - 在 ubuntu 和 node.js 上设置 ffmpeg

css - 如何在给定的帧中完整显示视频,而不仅仅是部分?

nginx - 将 H.264 直播流发送到 Nginx 并发布为 HLS 以嵌入到网站中

video-streaming - 使用 gstreamer 通过 rtp 流式传输 H.264 视频

c - 如何修剪 GStreamer 注册表?

html - 使用 HTML5 视频标签播放视频

C++ (Ubuntu) : load audio file (wav, mp3, aiff) 到数组/vector 与 gstreamer

ios - 将来自 VTCompressionSession 的压缩帧与音频数据混合到 MPEG2-TS 容器中以进行网络流式传输