m_fmt->video_codec = CODEC_ID_H264;
/* 添加视频流 */
m_video_st = av_new_stream(m_oc, 0);
if (!m_video_st) {
return 0;
}
m_videoc=avcodec_alloc_context();
m_videoc = m_video_st->codec;
/* 视频相关参数 */
m_videoc->codec_id = m_fmt->video_codec;
m_videoc->codec_type = CODEC_TYPE_VIDEO;
m_videoc->bit_rate = video_bitrate*1000;
m_videoc->width = video_width;
m_videoc->height = video_height;
m_videoc->time_base.den = 25;
m_videoc->time_base.num = 1;
m_videoc->dct_algo = 0;
m_videoc->gop_size = 12;
m_videoc->me_pre_cmp=2;
m_videoc->cqp = 26;
m_videoc->me_method =7;
m_videoc->qmin = 3;
m_videoc->qmax = 31;
m_videoc->max_qdiff = 3;
m_videoc->qcompress = 0.5;
m_videoc->qblur = 0.5;
m_videoc->nsse_weight = 8;
m_videoc->i_quant_factor = (float)0.8;
m_videoc->b_quant_factor = 1.25;
m_videoc->b_quant_offset = 1.25;
m_videoc->pix_fmt = PIX_FMT_YUV420P;//当前YUV420
if (m_videoc->codec_id == CODEC_ID_MPEG2VIDEO) {
m_videoc->max_b_frames = 2;
}
if (m_videoc->codec_id == CODEC_ID_MPEG1VIDEO){
m_videoc->mb_decision=2;
}
if(!strcmp(m_oc->oformat->name, "mp4")
|| !strcmp(m_oc->oformat->name, "mov")
|| !strcmp(m_oc->oformat->name, "3gp"))
//m_videoc->flags |= CODEC_FLAG_GLOBAL_HEADER;
m_videoc->flags |=CODEC_FLAG_QSCALE;
/* 检查参数是否设置完毕*/
if (av_set_parameters(m_oc, NULL) < 0) {
return 0;
}
dump_format(m_oc, 0, filename, 1);
/* 所有视频设置完毕,打开视频解码器,并打开必要的编码缓冲器 */
if (m_video_st){
AVCodec *video_codec;
/* 查找视频解码器 */
video_codec = avcodec_find_encoder(m_videoc->codec_id);
if (!video_codec) {
return 0;
}
/* 打开视频解码器 */
if (avcodec_open(m_videoc, video_codec) < 0) {
return 0;
}
video_outbuf = NULL;
if (!(m_oc->oformat->flags & AVFMT_RAWPICTURE)) {
/* allocate output buffer */
/* XXX: API change will be done */
/* buffers passed into lav* can be allocated any way you prefer,
as long as they're aligned enough for the architecture, and
they're freed appropriately (such as using av_free for buffers
allocated with av_malloc) */
video_outbuf_size = 200000;
video_outbuf = (uint8_t *)av_malloc(video_outbuf_size);
}
/* allocate the encoded raw picture */
picture = alloc_picture(m_videoc->pix_fmt, m_videoc->width, m_videoc->height);
if (!picture) {
return 0;
}
/* if the output format is not YUV420P, then a temporary YUV420P
picture is needed too. It is then converted to the required
output format */
tmp_picture = NULL;
if (m_videoc->pix_fmt != PIX_FMT_YUV420P) {
tmp_picture = alloc_picture(PIX_FMT_YUV420P, m_videoc->width, m_videoc->height);
if (!tmp_picture) {
return 0;
}
}
分享到:
相关推荐
这是一个用Ffmpeg进行h265编解码的实例,集成了demux,解码,编码相关的代码。
一个最简单的基于FFMPEG的视频编码器。该编码器实现了YUV420P的像素数据编码为H....详细信息《最简单的基于FFMPEG的视频编码器(YUV编码为H.264)》: http://blog.csdn.net/leixiaohua1020/article/details/25430425
将ffmpeg中的H264解码器提取到单独的工程中,并建立Visual Studio工程,方便集成到开发者自己的项目中,可以编译成动态库和静态库,方便使用。封装了C++ 接口IH264Encoder,只要传入编码buffer,便会得到解码后的H...
目前x264己经支持了大部分H.264编码工具,而且有多个产品和开源项目己经采用了x264编码器,包括VLC mediaPlayer、ffmpeg等。x264针对H.264编码采取了多种优化方案,包括支持快速搜索方案(例如六边形搜索、菱形搜索等...
利用socket接收rtsp流,并用ffmpeg将h.264编码的yuv格式的视频数据进行解码
曾经做视频会议相关项目的时候,需要在客户端实现多路视频推流,对若干摄像头以及桌面的数据进行编码推流,当每路数据都是1080p 30fps时,采用软编对cpu的压力是比较大的而且在1080p的基础上达到30fps的帧率也是比较...
Qt5基于FFmpeg读取摄像头生成yuv和rgb数据两份数据,利用解码线程类实现边解码生成rgb数据边在窗口类播放,利用生成的yuv数据进行编码生成h264文件(可播放)
此前做过一个YUV420P像素数据编码为H.264码流的例子。对这个例子进行了升级。升级后编码器实现了YUV420P像素数据编码为H.265码流。 尽管该视频编码器的代码十分简单,但是几乎包含了使用FFMPEG编码一个视频所有必备...
例如解码H.264, 就是“H.264码流->YUV”。 ? 一般的视频解码流程 ? 视频码流一般存储在一定的封装格式(例如MP4、 AVI等)中。封装 格式中通常还包含音频码流等内容。 ? 对于封装格式中的视频,需要先从封装...
1.使用ffmpeg将多张图片生成H264文件; 2.从H264文件中获取一帧图片和一帧中的SLICE图片; 3.能够直接使用ffplay.exe播放H264文件; 4.完整工程,可直接运行(附带测试图片和实例); 5.vs2013;
将5幅bmp图转为h264视频,可以下载VLC media player打开。需要注意,我这里采用的是http://ffmpeg.zeranoe.com/builds/下载的64位20121120版本的ffmpeg库,如果你的操作系统是32位的就要重新下过咯。另外,你编译...
一个示例代码,使用OpenCV捕获视频中的帧,然后通过使用FFmpeg在H.264中对这些帧进行编码来创建视频。 建造 进行源外构建的步骤。 mkdir build cd build cmake .. make 依存关系 此代码完全取决于OpenCV和FFmpeg。...
ffmpeg摄像头数据h264编码并封装avi http://blog.csdn.net/jklinux/article/details/72478004
通过rtsp协议获取后台实时视频流,自定义播放器播放,ffmpeg编码
FFMPEG的264编码 附件中包含libx264.a 及include文件
可以用于测试FFMPEG的H.264编码,从网上下载了几个都不太清晰,自已用FFMPEG从AVI文件提取了H.264码流
该代码通过调用ffmpeg实现了视频的编码,编码为封装的类,代码是跨库平台的,同时支持windows和linux 2.在windows下使用说明: 从ffmpeg官网下载win64-dev版本,它包含开发使用的lib和include;下载win64-share版本...
qsv-encoder-example intel hd 显卡 ffmpeg gpu编码示例 使用ffmpeg h264_qsv编码器
ffmpeg支持android H264编码 编译.zip
ffmpeg解码MP4生成h264和opus裸流数据,不只是MP4,其他的封装格式也行,只要ffmpeg支持的就可以。由于ffmpeg不支持获取opus的裸流数据,输出的是封装了opus的ogg文件,故自己调用ffmpeg-api获取裸流数据。webrtc传输...