FFmpeg实时封装海思H264裸流

weixin_42018622 2019-01-14 08:51:29
这边第一次用ffmpeg封装海思3531a的裸流成AVI时,文件能生成,VLC播放提示文件索引损坏,但是能播放。还有右键文件属性看不到任何媒体信息,比如分辨率,码率,帧率以及编码器等等信息。代码已经手动填充了AVCodecContext!下面贴出代码。。

[align=left]AVOutputFormat *ofmt = NULL;
AVFormatContext *ofmt_ctx = NULL;
AVStream *out_stream = NULL;
AVPacket pkt = { 0 };
HI_S32 size = 0;
char *filename = "/share/test.avi";
HI_U8 tmp[66666] = {0};

av_register_all();
av_log_set_level(AV_LOG_DEBUG);
//ff_avi_muxer
/* allocate the output media context */
avformat_alloc_output_context2(&ofmt_ctx, NULL, "avi", filename);
if (!ofmt_ctx) {
LOGE("Could not deduce output format from file extension: using AVI.\n");
avformat_alloc_output_context2(&ofmt_ctx, NULL, "avi", filename);
}
if(!ofmt_ctx) {
goto exit;
}

out_stream = avformat_new_stream(ofmt_ctx, NULL);
if (!out_stream) {
LOGE( "Failed allocating output stream\n");
//ret = AVERROR_UNKNOWN;
goto exit;
}

//AVCodecContext *avctx = out_stream->codec;
out_stream->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;
//avctx->codec_tag = AV_CODEC_FLAG_GLOBAL_HEADER;
/*此处,需指定编码后的H264数据的分辨率、帧率及码率*/
out_stream->codecpar->codec_id = AV_CODEC_ID_H264;
out_stream->codecpar->bit_rate = 2000000;
out_stream->codecpar->width = 1920;
out_stream->codecpar->height = 1080;
out_stream->time_base.num = 1;
out_stream->time_base.den = 25;
//out_stream->codec->time_base.num = 1;
//out_stream->codec->time_base.den = 25;

/* print output stream information*/
av_dump_format(ofmt_ctx, 0, filename, 1);

if (!(ofmt_ctx->oformat->flags & AVFMT_NOFILE))
{
s32Ret = avio_open(&ofmt_ctx->pb, filename, AVIO_FLAG_WRITE);
if (s32Ret < 0) {
LOGE( "Could not open output file '%s'\n", filename);
goto exit;
}
LOGD("Open output file success!\n");
}

s32Ret = avformat_write_header(ofmt_ctx, NULL);
if (s32Ret < 0) {
LOGE( "write avi file header failed\n");
goto exit;
}
LOGD("Write avi header success!\n");

...
while(1)
{
...
av_init_packet(&pkt);
#if 1
// determine whether the I frame
if(0x61 != pVStream.pstPack[i].pu8Addr[4]) {
pkt.flags |= AV_PKT_FLAG_KEY;
} else { /* p frame*/
pkt.flags = 0;
}

pkt.dts = pkt.pts = AV_NOPTS_VALUE;
pkt.size = pVStream.pstPack[i].u32Len;
pkt.data = pVStream.pstPack[i].pu8Addr;
if(!pkt.data) {
printf("no data\n");
}

//Write
s32Ret = av_interleaved_write_frame(ofmt_ctx, &pkt);
if (s32Ret < 0) {
//LOGE("muxer error");
av_strerror(s32Ret, pkt.data, 1024);
}
#endif
av_packet_unref(&pkt);
}
...
s32Ret = av_write_trailer(ofmt_ctx);
...全文
2202 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
詆調 2019-09-20
  • 打赏
  • 举报
回复
想问下pts时间信息怎么填写的
weixin_42018622 2019-03-15
  • 打赏
  • 举报
回复
终于抽时间弄好了,原来是一个很低级的错误,u盘没有卸载就拔出来了,导致avi文件异常。汗颜~~~~~~~~
smwhotjay 2019-01-16
  • 打赏
  • 举报
回复

avi格式也有很多吧,不太清楚。。
rightorwrong 2019-01-15
  • 打赏
  • 举报
回复
不清楚x-msvideo是标准的
weixin_42018622 2019-01-14
  • 打赏
  • 举报
回复
引用 2 楼 rightorwrong 的回复:
写avi文件时,没有写入标准avi信息

版主您好,您是指下面截图的吗?
rightorwrong 2019-01-14
  • 打赏
  • 举报
回复
写avi文件时,没有写入标准avi信息
weixin_42018622 2019-01-14
  • 打赏
  • 举报
回复
上面写的一个代码用例,请前辈帮忙看看问题在哪,由于对ffmpeg比较陌生,有没有人遇到同样的问题?
训练数据保存为deep_convnet_params.pkl,UI使用wxPython编写。卷积神经网络(CNN)是一种专门针对图像、视频等结构化数据设计的深度学习模型,在计算机视觉、语音识别、自然语言处理等多个领域有广泛应用。其核心设计理念源于对生物视觉系统的模拟,主要特点包括局部感知、权重共享、多层级抽象以及空间不变性。 **1. 局部感知与卷积操作** 卷积层是CNN的基本构建块,使用一组可学习的滤波器对输入图像进行扫描。每个滤波器在图像上滑动,以局部区域内的像素值与滤波器权重进行逐元素乘法后求和,生成输出值。这一过程能够捕获图像中的边缘、纹理等局部特征。 **2. 权重共享** 同一滤波器在整个输入图像上保持相同的权重。这显著减少了模型参数数量,增强了泛化能力,并体现了对图像平移不变性的内在假设。 **3. 池化操作** 池化层通常紧随卷积层之后,用于降低数据维度并引入空间不变性。常见方法有最大池化和平均池化,它们可以减少模型对微小位置变化的敏感度,同时保留重要特征。 **4. 多层级抽象** CNN通常包含多个卷积和池化层堆叠在一起。随着网络深度增加,每一层逐渐提取更复杂、更抽象的特征,从底层识别边缘、角点,到高层识别整个对象或场景,使得CNN能够从原始像素数据中自动学习到丰富的表示。 **5. 激活函数与正则化** CNN中使用非线性激活函数来引入非线性表达能力。为防止过拟合,常采用正则化技术,如L2正则化和Dropout,以增强模型的泛化性能。 **6. 应用场景** CNN在诸多领域展现出强大应用价值,包括图像分类、目标检测、语义分割、人脸识别、图像生成、医学影像分析以及自然语言处理等任务。 **7. 发展与演变** CNN的概念起源于20世纪80年代,其影响力在硬件加速和大规模数据集出现后真正显现。经典模型如LeNet-5用于手写数字识别,而AlexNet、VGG、GoogLeNet、ResNet等现代架构推动了CNN技术的快速发展。如今,CNN已成为深度学习图像处理领域的基石,并持续创新。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!

2,554

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧