社区
多媒体/流媒体开发
帖子详情
YUV420数据和字符信息如何利用滤镜方法进行编码?
柳长街
2013-06-24 10:14:47
YUV420数据和字符信息如何利用滤镜方法进行编码?
我希望用ffmpeg中的filter方法,把YUV420数据和字符信息一起编码,该怎么办呢?
本人的qq:94643913,望有做过的朋友联系本人!
本人目前只实现了把yuv420的数据进行h.264的编码了。
...全文
1456
7
打赏
收藏
YUV420数据和字符信息如何利用滤镜方法进行编码?
YUV420数据和字符信息如何利用滤镜方法进行编码? 我希望用ffmpeg中的filter方法,把YUV420数据和字符信息一起编码,该怎么办呢? 本人的qq:94643913,望有做过的朋友联系本人! 本人目前只实现了把yuv420的数据进行h.264的编码了。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
7 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
Henry0214
2015-01-31
打赏
举报
回复
好人必须赞一个,国内发帖比较少见到有人自己解决问题了发出来分享的。希望大家都能发扬这样的精神
youngalmond11
2014-05-16
打赏
举报
回复
楼主做出来分享很高尚,赞一个!
黑泡泡选手
2014-02-10
打赏
举报
回复
给个效果图看看哪~
wutianke
2014-02-10
打赏
举报
回复
将YUV420数据编码成H264数据,例程可以给我发一下吗,谢谢 是利用的ffmpeg吧?初学中
smilestone322
2013-12-13
打赏
举报
回复
不错,支持下
柳长街
2013-06-28
打赏
举报
回复
本人成功实现利用ffmpeg中的滤镜 filter功能,在码流中进行字符叠加,太不容易了! 本人使用的是ffmpeg 1.0.7的代码 部分代码如下: //设定输出格式列表,支持PIX_FMT_YUV420P,PIX_FMT_GRAY8,PIX_FMT_RGB24 //enum FFmpegPixFmt::PixelFormat pix_fmts[] = {PIX_FMT_GRAY8, PIX_FMT_NONE }; //初始化滤镜所用的变量 static int init_filters(const char *filters_descr) { char args[512]; int ret; AVFilter *buffersrc = avfilter_get_by_name("buffer"); AVFilter *buffersink = avfilter_get_by_name("ffbuffersink"); AVFilterInOut *outputs = avfilter_inout_alloc(); AVFilterInOut *inputs = avfilter_inout_alloc(); enum PixelFormat pix_fmts[] = {PIX_FMT_YUV420P, PIX_FMT_NONE }; AVBufferSinkParams *buffersink_params; filter_graph = avfilter_graph_alloc(); /* buffer video source: the decoded frames from the decoder will be inserted here. */ _snprintf(args, sizeof(args), "video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:pixel_aspect=%d/%d", dec_ctx->width, dec_ctx->height, dec_ctx->pix_fmt, dec_ctx->time_base.num, dec_ctx->time_base.den, dec_ctx->sample_aspect_ratio.num, dec_ctx->sample_aspect_ratio.den); ret = avfilter_graph_create_filter(&buffersrc_ctx, buffersrc, "in",args, NULL, filter_graph); if (ret < 0) { av_log(NULL, AV_LOG_ERROR, "Cannot create buffer source\n"); return ret; } /* buffer video sink: to terminate the filter chain. */ buffersink_params = av_buffersink_params_alloc(); buffersink_params->pixel_fmts = pix_fmts; ret = avfilter_graph_create_filter(&buffersink_ctx,buffersink,"out",NULL,buffersink_params, filter_graph); av_free(buffersink_params); if (ret < 0) { av_log(NULL, AV_LOG_ERROR, "Cannot create buffer sink\n"); return ret; } /* Endpoints for the filter graph. */ outputs->name = av_strdup("in"); outputs->filter_ctx = buffersrc_ctx; outputs->pad_idx = 0; outputs->next = NULL; inputs->name = av_strdup("out"); inputs->filter_ctx = buffersink_ctx; inputs->pad_idx = 0; inputs->next = NULL; if ((ret = avfilter_graph_parse(filter_graph, filters_descr,&inputs, &outputs, NULL)) < 0) return ret; if ((ret = avfilter_graph_config(filter_graph, NULL)) < 0) return ret; return 0; } char *outfilename = "D:\\out.yuv"; FILE *fp = fopen(outfilename, "a+b"); //所有视频帧都存在同一个文件 //fp = fopen(outfilename, "wb");//每次存一个文件 //滤镜描述字符串 const CHAR *filter_descr="drawtext=fontfile=simfont.ttf:fontcolor=white:shadowcolor=black:text='测试视频':x=10:y=10"; int ret=0; AVPacket packet; AVFrame m_frame; int got_frame; avcodec_register_all(); av_register_all(); avfilter_register_all(); if ((ret = open_input_file("input.h264")) < 0) goto end; if ((ret = init_filters(filter_descr)) < 0) goto end; /* read all packets */ while (1) { AVFilterBufferRef *picref; if ((ret = av_read_frame(fmt_ctx, &packet)) < 0) break; if (packet.stream_index != video_stream_index) continue; avcodec_get_frame_defaults(&m_frame); got_frame = 0; ret = avcodec_decode_video2(dec_ctx, &m_frame, &got_frame, &packet); if (ret < 0) { av_log(NULL, AV_LOG_ERROR, "Error decoding video\n"); break; } if (got_frame) { m_frame.pts = av_frame_get_best_effort_timestamp(&m_frame); if (av_buffersrc_add_frame(buffersrc_ctx, &m_frame, 0) < 0) { av_log(NULL, AV_LOG_ERROR, "Error while feeding the filtergraph\n"); break; } while (1) { ret = av_buffersink_get_buffer_ref(buffersink_ctx, &picref, 0); if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) break; if (ret < 0) goto end; if (picref) { fwrite(picref->data[0], 1, picref->buf->w * picref->buf->h * 3 / 2, fp); fflush(fp);// fclose(fp); //display_picref(picref, buffersink_ctx->inputs[0]->time_base); avfilter_unref_bufferp(&picref); } } } av_free_packet(&packet); } end: avfilter_graph_free(&filter_graph); if (dec_ctx) avcodec_close(dec_ctx); avformat_close_input(&fmt_ctx); if (ret < 0 && ret != AVERROR_EOF) { char buf[1024]; av_strerror(ret, buf, sizeof(buf)); fprintf(stderr, "Error occurred: %s\n", buf); exit(1); } MessageBox("解码完成!");
神勇小胖子
2013-06-25
打赏
举报
回复
楼主你好,能帮你实现yuv420的数据进行264编码的例子发给我参考下么,目前刚好在学习这个
使用ffmpeg API 将
yuv
文件多路合并为一路
使用ffmpeg 的api, 创建
滤镜
图,输入多路
yuv
数据
,
利用
滤镜
图将多路输入的
yuv
合成为一路,四宫格。 ffmpeg源码中有多个参考demo, docs/examples/ 可以参考,比如
滤镜
的filtering_video.c (不过这个demo创建的
滤镜
...
利用
FFmpeg API
进行
字符
叠加和加水印
前面两篇文章详细讲解了怎么叠加字幕和...要在其他平台
进行
叠加字幕和Logo有什么比较通用的方案呢?其实FFmpeg已经集成了一个加水印
滤镜
功能,用跨平台的FFmpeg能够帮助我们轻松实现该功能。 废话少说,先看看加水...
Android平台上基于OpenGl渲染
yuv
视频
前言 这是我音视频专栏的第一篇实例解析,...本文将重点讲知识点1和3,ndk开发部分就不细谈,由于OpenGl知识体系庞大,本文也是根据重点来分析,所以如果没有ndk开发基础和OpenGl基础的读者看本文可能会比较困难......
FFmpeg
滤镜
详解
2. 基本原理● 在
编码
前,ffmpeg可以对raw(真实/原)音频和视频使用libavfilter库中的
滤镜
进行
处理。(非压缩
数据
帧)● 多个
滤镜
可以组成
滤镜
链图(
滤镜
链图filtergraphs )。● 在ffmpeg看来只有2种
滤镜
:简单
滤镜
...
ffmpeg
利用
滤镜
合并四个视频,左一右三
ffmpeg
利用
滤镜
进行
视频混合(命令行) 四个文件都是1920x1080,时长一分钟,帧率为10. 关于主调函数,如下所示: int main() { CVideoMerge cVideoMerge; const char *pFileA = "E:\\learn\\ffmpeg\\...
多媒体/流媒体开发
2,543
社区成员
20,280
社区内容
发帖
与我相关
我的任务
多媒体/流媒体开发
专题开发/技术/项目 多媒体/流媒体开发
复制链接
扫一扫
分享
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章