ffmpeg--编码解码h264
2013-05-16 18:19
295 查看
YUV转H264
代码如下:#define _WIDTH 352 #define _HEIGHT 288 void CEncodeYUVDlg::OnButEncode() { // TODO: Add your control notification handler code here uint8_t *video_outbuf; int video_outbuf_size, out_size; /* alloc image and output buffer */ video_outbuf_size = 10000000; video_outbuf = (unsigned char *)malloc(video_outbuf_size); av_register_all(); avcodec_init(); unsigned char sYUV_data[_WIDTH*_HEIGHT*3/2]; AVCodecContext *pContext = avcodec_alloc_context(); /* put sample parameters */ pContext->codec_id = CODEC_ID_H264; //也可设其他类型,如:CODEC_ID_MPEG1VIDEO,但参数需更改,如:400K码率,10的帧率,就会崩溃。 pContext->codec_type = CODEC_TYPE_VIDEO; pContext->bit_rate = 400000; pContext->width = _WIDTH; pContext->height = _HEIGHT; pContext->time_base.den = 25; pContext->time_base.num = 1; pContext->gop_size = 25; pContext->pix_fmt = PIX_FMT_YUV420P; pContext->dct_algo = 0; pContext->me_pre_cmp=2; pContext->cqp = 26; pContext->me_method =7; pContext->qmin = 3; pContext->qmax = 31; pContext->max_qdiff = 3; pContext->qcompress = 0.5; pContext->qblur = 0.5; pContext->nsse_weight = 8; pContext->i_quant_factor = (float)0.8; pContext->b_quant_factor = 1.25; pContext->b_quant_offset = 1.25; /* find the mpeg1 video encoder */ AVCodec* codec = avcodec_find_encoder(pContext->codec_id); avcodec_open(pContext, codec); AVFrame* g_pInFrame = avcodec_alloc_frame(); int isize = pContext->width * pContext->height; g_pInFrame->data[0] = sYUV_data; g_pInFrame->data[1] = g_pInFrame->data[0] + isize; g_pInFrame->data[2] = g_pInFrame->data[1] + isize / 4; g_pInFrame->linesize[0] = pContext->width; g_pInFrame->linesize[1] = pContext->width / 2; g_pInFrame->linesize[2] = pContext->width / 2; FILE* fp = fopen("01.mov","rb"); int nread = -1; if (fp!=NULL) { while(nread!=0) { nread = fread(sYUV_data,1,_WIDTH*_HEIGHT*3/2,fp); out_size = avcodec_encode_video(pContext, video_outbuf, video_outbuf_size, g_pInFrame); if (out_size>0) { FILE* ff = fopen("1.mov","ab"); if (ff!=NULL) { fwrite(video_outbuf,1,out_size,ff); fclose(ff); } } } fclose(fp); AfxMessageBox("Encode Over!"); } }
H264转YUV
有一帧H264码流,如何变成YUV数据。ffmpeg解码
代码如下:
avcodec_init(); av_register_all(); AVCodec* m_pCodec=avcodec_find_decoder(CODEC_ID_H264); if(NULL==m_pCodec) return FALSE; AVCodecContext* m_pContext = avcodec_alloc_context(); AVFrame* m_pFrame = avcodec_alloc_frame(); if(NULL==m_pContext ||NULL==m_pFrame) return FALSE; if (avcodec_open(m_pContext, m_pCodec) < 0) { return FALSE; } int nWidth = 352; int nHeight = 288; int uSize; int iLen=avcodec_decode_video(m_pContext,m_pFrame,&uSize,pInBuffer,iBufferSize); if((uSize>0) &&(iLen>0)) { LPBYTE PtrY = m_pFrame->data[0]; LPBYTE PtrU = m_pFrame->data[1]; LPBYTE PtrV = m_pFrame->data[2]; int iSizeY = m_pFrame->linesize[0]; int iSizeU = m_pFrame->linesize[1]; int iSizeV = m_pFrame->linesize[2]; FILE*fp = fopen("1.yuv","ab"); if (fp!=NULL) { //copy y for (int i =0;i<nHeight;i++) { fwrite(PtrY,1,nWidth,fp); PtrY+=iSizeY; } //copy u for (int i =0;i<nHeight/2;i++) { fwrite(PtrU,1,nWidth/2,fp); PtrU+=iSizeU; } //copy v for (int i =0;i<nHeight/2;i++) { fwrite(PtrV,1,nWidth/2,fp); PtrV+=iSizeV; } ////copy to file fclose(fp); } }
相关文章推荐
- windows下 使用 ffmpeg 解码显示编码为H264的RTSP流
- ffmpeg解码jpg并编码成h264
- ios 6.1下ffmpeg真机库带h264编码解码
- 利用 ffmpeg x264 编码解码 h264
- FFMPEG 用H264编码封装mp4 有声音无图像。或者解码错误
- ffmpeg解码jpg并编码成h264
- ffmpeg编译x264, 这个libffmpeg即可解码又可以h264编码
- ffmpeg-1.0 解码 H264 (example修改成功)
- 使用ffmpeg将yuv编码成h264时有大小限制,太小的数据源编码会失败。
- 用x264和ffmpeg将YUV编码为.h264(1)
- ffmpeg h264解码, 屏蔽因为网络丢包等各种原因导致的花屏帧
- WebRTC 集成X264编码和ffmpeg解码
- android 4.4 H264 ffmpeg编解码
- 【FFMPEG】【ARM-Linux开发】fmpeg安装第三方编码器(encoder)库,ffmpeg编码h264(完)
- 实现 V4L2视频采集与 FFMPEG 编码YUYV 数据 为H264(2)
- WebRTC VideoEngine综合应用示例(三)——集成X264编码和ffmpeg解码
- FFMPEG(三) v4l2 数据编码H264
- ffmpeg 编码h264 profile如何设置为baseline的问题
- rtsp获取视频帧 ffmpeg解码h264数据 D3D显示yv12数据
- 03 ffmpeg 解码SDK调用 H264转YUV420