【问题标题】:Can I have a rawvideo stream in a MPEG TS container我可以在 MPEG TS 容器中有一个 rawvideo 流吗
【发布时间】:2021-03-07 16:05:50
【问题描述】:

我通过网络 (UDP) 收到一个 MPEG TS 容器。它包含两个流:一个 yuv420p 像素格式的 mpeg2video 视频流和一个使用专有 KLV 格式编码的数据流。

我的接收程序必须使用 Python。所以,我不能直接使用 FFMPEG 库(如AVFormatAVCodec)。

现在我的问题如下:

我需要接收视频帧并将它们保存为 RGB 图像作为原始 numpy 数组。我还需要为每一帧解析相应的 KLV 数据。视频帧和 KLV 数据单元之间存在一对一的关系。

我以为我使用ffprobe 从传入容器输出数据包,包括其有效负载数据,然后解析ffprobe 的输出以获取图像和元数据:

$ ffprobe -show_packets -show_data -print_format json udp://127.0.0.1:12345 > test_video.packets.data.json 

这给了我一个输出(在test_video.packets.data.json 文件中),例如:

{
    "codec_type": "video",
    "stream_index": 0,
    "pts": 140400,
    "pts_time": "1.560000",
    "dts": 136800,
    "dts_time": "1.520000",
    "duration": 3600,
    "duration_time": "0.040000",
    "size": "21301",
    "pos": "3788012",
    "flags": "K_",
    "side_data_list": [
        {
            "side_data_type": "MPEGTS Stream ID"
        }
    ],
    "data": "... "
},
{
    "codec_type": "data",
    "stream_index": 1,
    "pts": 140400,
    "pts_time": "1.560000",
    "dts": 140400,
    "dts_time": "1.560000",
    "size": "850",
    "pos": "3817904",
    "flags": "K_",
    "side_data_list": [
        {
            "side_data_type": "MPEGTS Stream ID"
        }
    ],
    "data": ".... "
}

我可以从数据包中提取 KLV 数据并解析它。然而,视频包中的数据以 yuv420p 像素格式编码为 mpeg2video 视频。

我的问题:

  1. 如何从 mpeg2 编码的负载中获取原始像素值?
  2. 是否可以使用 ffmpeg 接收原始容器并将其(使用两个流)复制到新容器中,但使用原始视频而不是 mpeg2 视频?如果是,如何?命令应该是什么?例如,我试过:ffmpeg -i udp://127.0.0.1:12345 -map 0:0 -codec rawvideo -pix_fmt rgb24 -map 0:1 -codec copy -f mpegts udp://127.0.0.1:11112,但它在视频数据包的有效负载中再次给了我 mpeg2 编码的视频数据

【问题讨论】:

  • 1.必须对帧进行解码才能访问栅格。 2. MPEG-TS 不支持 rawvideo。 MKV、NUT 甚至 AVI 都可以。
  • @Gyan 谢谢。 1.您能否指出我如何将帧解码为原始 RGB 图像的方法? 2. 能否提供参考(文档链接、维基百科等)?
  • 1.在 ffmpeg 中使用格式过滤器转换为rgb24 2. 容器中的编解码器支持没有记录。您必须检查源代码或运行命令并检查错误。
  • 该命令将失败,因为您尚未使用-f 设置输出复用器。如果你这样做了,并将其设置为mpegts,那么数据包时间戳将继续存在。问题是 mpegts 不支持 rawvideo。但是,因为我们谈论的是未压缩的帧。您可以将其复用为私有数据流,并正确解释数据包数据。
  • ffmpeg -i udp://127.0.0.1:12345 -map 0:0 -map 0:1 -c copy -c:v rawvideo -pix_fmt rgb24 -f mpegts udp://127.0.0.1:11112

标签: ffmpeg mpeg2-ts transport-stream


【解决方案1】:

MPEG-TS 支持有限数量的视频编解码器。但是,ffmpeg 的 muxer 会默默地将不支持的流混合为私有数据流。

要复用原始 RGB 流,请转换为 rgb24 像素格式并使用 rawvideo 编解码器进行编码。

ffmpeg -i udp://127.0.0.1:12345 -map 0:0 -map 0:1 -c copy -c:v rawvideo -pix_fmt rgb24 -f mpegts udp://127.0.0.1:11112

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-18
    • 2012-01-27
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2013-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多