gpt4 book ai didi

c++ - ffmpeg c++ API 使用 KLV 数据流编码 mpegts

转载 作者:行者123 更新时间:2023-12-01 14:55:38 28 4
gpt4 key购买 nike

我需要使用 ffmpeg C++ API 对 mpegts 视频进行编码。输出视频应有两个流:第一个应为 AVMEDIA_TYPE_VIDEO 类型;第二个应为 AVMEDIA_TYPE_DATA 类型,并应包含一组 KLV 数据。

我已经编写了自己的 KLV 库来管理 KLV 格式。

但是,我无法通过组合这两个流来“从头开始”创建新视频。按照FFMPEG C api h.264 encoding / MPEG2 ts streaming problems中的实现我可以使用单个视频流成功编码 mpegts 视频。

但是我无法将新的 AVMEDIA_TYPE_DATA 流添加到输出视频,因为一旦我使用 avformat_new_stream(...) 之类的方法添加新数据流,输出视频就为空:数据流和制作视频,输出文件为空。

任何人都可以向我推荐有关如何以 mpegts 格式将数据流正确添加到输出视频的教程页面或示例吗?

非常感谢!

最佳答案

我能够通过从 FFmpeg 源附带的“muxing.c”示例开始并将其修改如下,将 KLV 流添加到多路输出。

首先,我按如下方式创建了 AVStream,其中“oc”是 AVFormatContext(多路复用器)变量:

AVStream *klv_stream = klv_stream = avformat_new_stream(oc, NULL);
klv_stream->codec->codec_type = AVMEDIA_TYPE_DATA;
klv_stream->codec->codec_id = AV_CODEC_ID_TIMED_ID3;
klv_stream->time_base = AVRational{ 1, 30 };
klv_stream->id = oc->nb_streams - 1;

然后,在编码/复用循环期间:

AVPacket pkt;
av_init_packet(&pkt);
pkt.data = (uint8_t*)GetKlv(pkt.size);
auto res = write_frame(oc, &video_st.st->time_base, klv_stream, &pkt);
free(pkt.data);

(GetKlv() 函数返回一个由 malloc() 处理的二进制数据数组,该数组将替换为您用来获取编码 KLV 的任何内容。它将 pkt.size 设置为数据的长度。)

通过这个修改,并指定一个“.ts”目标文件,我得到了一个在 VLC 中播放得很好的三流文件。 KLV流的stream_type为0x15,表示同步KLV。

记下 AV_CODEC_ID_TIMED_ID3 的 codec_id 值。根据 libavformat 源文件“mpegtsenc.c”,对于异步 KLV(无伴随 PTS 或 DTS),AV_CODEC_ID_OPUS 的值应导致 stream_type 6。这实际上对我的应用程序很重要,但我无法让它工作——对 avformat_write_header() 的调用抛出一个被零除的错误。如果我弄清楚了,我会在此处添加更新。

关于c++ - ffmpeg c++ API 使用 KLV 数据流编码 mpegts,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35801086/

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