我可以在 MPEG TS 容器中有原始视频流吗
Can I have a rawvideo stream in a MPEG TS container
我通过网络 (UDP) 收到一个 MPEG TS 容器。它包含两个流:一个具有 yuv420p 像素格式的 mpeg2video vidoe 流和一个使用 propitiatory KLV 格式编码的数据流。
我的接收器程序必须在 Python 中。所以,我不能直接使用 FFMPEG 库(如 AVFormat
、AVCodec
)。
现在我的问题如下:
我需要接收视频帧并将它们保存为 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 视频。
我的问题:
- 如何从 mpeg2 编码的负载中获取原始像素值?
- 是否可以使用 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 编码的视频数据
MPEG-TS 支持有限数量的视频编解码器。然而,ffmpeg 的 muxer 会静静地 mux 甚至不支持的流作为私有数据流。
要混合原始 RGB 流,请转换为 rgb24
像素格式并使用原始视频编解码器进行编码。
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
我通过网络 (UDP) 收到一个 MPEG TS 容器。它包含两个流:一个具有 yuv420p 像素格式的 mpeg2video vidoe 流和一个使用 propitiatory KLV 格式编码的数据流。
我的接收器程序必须在 Python 中。所以,我不能直接使用 FFMPEG 库(如 AVFormat
、AVCodec
)。
现在我的问题如下:
我需要接收视频帧并将它们保存为 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 视频。
我的问题:
- 如何从 mpeg2 编码的负载中获取原始像素值?
- 是否可以使用 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 编码的视频数据
MPEG-TS 支持有限数量的视频编解码器。然而,ffmpeg 的 muxer 会静静地 mux 甚至不支持的流作为私有数据流。
要混合原始 RGB 流,请转换为 rgb24
像素格式并使用原始视频编解码器进行编码。
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