首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ffmpeg c++ API用KLV数据流编码mpegt

ffmpeg c++ API用KLV数据流编码mpegt
EN

Stack Overflow用户
提问于 2016-03-05 00:26:39
回答 1查看 3K关注 0票数 2

我需要编码一个mpegts视频使用的C++应用程序接口。输出视频应具有两个流:第一个流应为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格式的输出视频中的示例?

非常感谢!

EN

回答 1

Stack Overflow用户

发布于 2019-11-30 04:16:14

通过从FFmpeg源代码附带的"muxing.c“示例开始,并按如下所示进行修改,我能够将KLV流添加到多路复用输出中。

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

代码语言:javascript
复制
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; 

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

代码语言:javascript
复制
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()处理的二进制数据数组,它将pkt.size设置为数据的长度。)

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

注意AV_CODEC_ID_TIMED_ID3的codec_id值。根据libavformat源文件"mpegtsenc.c",对于异步KLV,AV_CODEC_ID_OPUS的值应该是stream_type 6 (没有附带的PTS或DTS)。这对我的应用程序实际上很重要,但是我无法让它工作--对avformat_write_header()的调用抛出了一个被零除的错误。如果我弄清楚了,我会在这里添加一个更新。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35801086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档