FFMPEG:压缩之H264编码(YUV420P->H264)

简介: <p><strong>720*576@25hz,550帧的yuv420p数据,编码时间13.3秒。</strong></p><p><strong><br></strong></p><img src="http://img.blog.csdn.net/20141126144246140?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbWFvMDUx

720*576@25hz,550帧的yuv420p数据,编码时间13.3秒。



void CTest0Dlg::OnButton5() 
{
// TODO: Add your control notification handler code here
int nWidth = 720;
int nHeight= 576;

av_register_all();
avcodec_register_all();
AVFrame *m_pYUVFrame = new AVFrame[1];;  //YUV帧数据
AVCodecContext *c= NULL;
AVCodec *pCodecH264; //编码器
uint8_t * yuv_buff;//

//查找h264编码器
pCodecH264 = avcodec_find_encoder(CODEC_ID_H264);
if(!pCodecH264)
{
 fprintf(stderr, "h264 codec not found\n");
 exit(1);
}

c= avcodec_alloc_context();
c->bit_rate = 1000000;// put sample parameters 
c->width =720;// 
c->height = 576;// 

// frames per second 
AVRational rate;
rate.num = 1;
rate.den = 25;
c->time_base= rate;//(AVRational){1,25};
c->gop_size = 10; // emit one intra frame every ten frames 
c->max_b_frames=1;
c->thread_count = 1;
c->pix_fmt = PIX_FMT_YUV420P;//PIX_FMT_RGB24;

//av_opt_set(c->priv_data, /*"preset"*/"libvpx-1080p.ffpreset", /*"slow"*/NULL, 0);
//打开编码器
if(avcodec_open(c,pCodecH264)<0)
 TRACE("不能打开编码库");

int size = c->width * c->height;
yuv_buff = (uint8_t *) malloc((size * 3) / 2); // size for YUV 420 

//图象编码
int outbuf_size=100000;
uint8_t * outbuf= (uint8_t*)malloc(outbuf_size); 
int u_size = 0;
FILE *f=NULL; 
char * filename = "e:\\pic\\000.264";
f = fopen(filename, "wb");
if (!f)
{
 TRACE( "could not open %s\n", filename);
 exit(1);
}

AVPacket avpkt;
    FILE *fp;
fp = fopen("d:\\temp\\VIDEO720576.yuv","rb+");

//AVFrame *pTFrame=new AVFrame
while (1)
{
 int len = fread(yuv_buff,1,nWidth* nHeight*3/2,fp);
 if (len==0)
 {
 break;
 }
 avpicture_fill((AVPicture*)m_pYUVFrame, (uint8_t*)yuv_buff, PIX_FMT_YUV420P, nWidth, nHeight);
 int got_packet_ptr = 0;
 av_init_packet(&avpkt);
 avpkt.data = outbuf;
 avpkt.size = outbuf_size;
while(1)
{
 u_size = avcodec_encode_video(c, outbuf, outbuf_size, m_pYUVFrame);


 if (u_size > 0 && u_size<100000)
 {
fwrite(avpkt.data, 1, u_size, f);
break;
 }
}
}

fclose(f); 
fclose(fp); 
delete []m_pYUVFrame;
free(outbuf);
avcodec_close(c);
av_free(c);
MessageBox("over");

}

http://download.csdn.net/detail/mao0514/8202691


相关文章
|
8月前
|
存储 编解码 数据处理
【FFmpeg 视频基本格式】深入理解FFmpeg:从YUV到PCM,解码到编码(三)
【FFmpeg 视频基本格式】深入理解FFmpeg:从YUV到PCM,解码到编码
247 0
|
8月前
|
存储 编解码 数据处理
【FFmpeg 视频基本格式】深入理解FFmpeg:从YUV到PCM,解码到编码(二)
【FFmpeg 视频基本格式】深入理解FFmpeg:从YUV到PCM,解码到编码
262 0
|
8月前
ffmpeg 命令提取音视频数据-ffmpeg导出h265裸流-ffmpeg导出h264裸流
ffmpeg 命令提取音视频数据-ffmpeg导出h265裸流-ffmpeg导出h264裸流
209 0
|
2月前
|
编解码 监控 网络协议
如何使用FFmpeg实现RTSP推送H.264和H.265(HEVC)编码视频
本文详细介绍了如何使用FFmpeg实现RTSP推送H.264和H.265(HEVC)编码视频。内容涵盖环境搭建、编码配置、服务器端与客户端实现等方面,适合视频监控系统和直播平台等应用场景。通过具体命令和示例代码,帮助读者快速上手并实现目标。
619 6
|
7月前
|
编解码 Linux 计算机视觉
python 调用ffmpeg使用usb摄像头录制视频,输出h264格式,自动获取摄像头的最佳帧率和最大画面尺寸
使用 Python 调用 FFmpeg 进行 USB 摄像头视频录制,需先确保安装 FFmpeg 和 Python 的 `subprocess` 模块。代码示例展示了如何自动获取摄像头的最佳帧率和最大分辨率,然后录制视频。首先通过 FFmpeg 列出摄像头格式获取信息,解析出帧率和分辨率,选择最优值。之后调用 FFmpeg 命令录制视频,设置帧率、分辨率等参数。注意 `/dev/video0` 是 Linux 的摄像头设备路径,Windows 系统需相应调整。代码中未直接实现自动获取最佳参数,通常需要借助其他库如 OpenCV。
ffmpeg编码报错:more samples than frame size (avcodec_encode_audio2)
ffmpeg编码报错:more samples than frame size (avcodec_encode_audio2)
145 0
ffmpeg编码报错:more samples than frame size (avcodec_encode_audio2)
|
8月前
|
编解码 API 数据处理
【摄像头数据处理】摄像头数据处理:使用FFmpeg合并、编码和封装视频流
【摄像头数据处理】摄像头数据处理:使用FFmpeg合并、编码和封装视频流
444 0
|
8月前
|
存储 缓存 编解码
【FFmpeg 视频基本格式】深入理解FFmpeg:从YUV到PCM,解码到编码(一)
【FFmpeg 视频基本格式】深入理解FFmpeg:从YUV到PCM,解码到编码
247 0
|
8月前
|
编解码 并行计算
ffmpeg cuda加速 h264->hevc(h265) 缩小存储空间
ffmpeg cuda加速 h264->hevc(h265) 缩小存储空间
256 0
ffmpeg获取视频大小再压缩视频脚本
ffmpeg获取视频大小再压缩视频脚本
118 0

热门文章

最新文章