gpt4 book ai didi

ffmpeg - 使用 FFMPEG 从 H264 制作 HLS 剪辑

转载 作者:行者123 更新时间:2023-12-04 22:50:39 29 4
gpt4 key购买 nike

我正在使用 HiSilicon 的 Hi35xx 相机处理器。它是一个 Arm9,侧面用 bolt 固定了视频管道。管道的一端是 CMOS 传感器。另一端是 H264 编码器。当我打开管道时,编码器输出 H264 NAL 数据包,如下所示:

frame0: <SPS>,<PPS>,<SEI>,<key frame>
frame1: <delta frame>
frame2: <delta frame>
...
frameN: <delta frame>
frameN+1: <SPS>,<PPS>,<SEI><key frame>
frameN+2: <delta frame>
frameN+3: <delta frame>
...
etc.

我通过执行以下操作将其转换为 HLS 剪辑(为了清楚起见,使用伪代码):
av_register_all();
avformat_network_init();

avformat_alloc_output_context2(&ctx_out, NULL, "hls", "./foo.m3u8");

strm_out = avformat_new_stream(ctx_out, NULL);

codec_out = strm_out->codecpar;
codec_out->codec_id = AV_CODEC_ID_H264;
codec_out->codec_type = AVMEDIA_TYPE_VIDEO;
codec_out->width = encoder_width;
codec_out->height = encoder_height;
codec_out->bit_rate = encoder_bitrate;
codec_out->codec_tag = 0;

avformat_write_header(ctx_out, NULL);

while(get_packet_from_pipeline_encoder(&encoder_packet)) {
AVPacket pkt;
av_init_packet(&pkt);
pkt.stream_index = 0;

pkt.dts = AV_NOPTS_VALUE;
pkt.pts = AV_NOPTS_VALUE;
pkt.duration = (1000000/FRAMERATE); // frame rate in microseconds

pkt.data = encoder_packet.data;
pkt.size = encoder_packet.size;

if (is_keyframe(&encoder_packet)) {
pkt.flags |= AV_PKT_FLAG_KEY;
}

av_write_frame(ctx_out, &pkt);
}

av_write_trailer(ctx_out);
avformat_free_context(ctx_out);

这似乎工作正常,只是生成的 HLS 帧速率不正确。当然,这是因为我没有正确设置 pts/dts 的东西,而 ffmpeg 让我知道了这一点。所以我有两个问题:
  • 我这样做对吗?
  • 如何正确设置 pts/dts 的东西?

  • 编码器给我数据包,我将它们作为帧提交。那些 <SPS>, <PPS> and <SEI>数据包实际上是带外数据,并且实际上没有时间戳。我怎样才能正确提交它们?

    最佳答案

    我的结论是我走错了路。基本问题是我没有输入上下文,因此没有 h264 解析器可以获取 SPS、PPS 和 SEI 数据包并对它们执行任何操作。我怀疑我的循环似乎正在工作,因为我正在写入一个“mpegts”文件,该文件只是带有前导 NAL 零的 h264 数据包替换为长度字(一些比特流过滤器正在这样做)。但这意味着我无法获得正确的时间戳,因为我必须将它们作为帧提交。我不能将它们作为“extradata/sidedata”提交,因为没有解码器来捕捉它们。

    通过为我的编码器的输出编写自定义 IO 上下文,然后执行正常的输入上下文,可以解决此问题。我已经用这种方法做了一些实验,它似乎有效。

    关于ffmpeg - 使用 FFMPEG 从 H264 制作 HLS 剪辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47394659/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com