嵌入式linux h.264,嵌入式linux-ffmpeg移栽 编码H264(am335x编码H264)

/*

arm-linux-gcc -o yuv2264 yuv2264.c -I/usr/local/ffmpeg_arm/include/ -L/usr/local/ffmpeg_arm/lib/ -lswresample -lavformat -lavutil -lavcodec -lswscale -lx264 libSDL.a

*/

#include "stdio.h"

#include "stdlib.h"

#include "libavformat/avformat.h"

#include "libavdevice/avdevice.h"

#include "libswresample/swresample.h"

#include "libavutil/opt.h"

#include "libavutil/channel_layout.h"

#include "libavutil/parseutils.h"

#include "libavutil/samplefmt.h"

#include "libavutil/fifo.h"

#include "libavutil/intreadwrite.h"

#include "libavutil/dict.h"

#include "libavutil/mathematics.h"

#include "libavutil/pixdesc.h"

#include "libavutil/avstring.h"

#include "libavutil/imgutils.h"

#include "libavutil/timestamp.h"

#include "libavutil/bprint.h"

#include "libavutil/time.h"

#include "libavutil/threadmessage.h"

#include "libavfilter/avcodec.h"

#include "libavcodec/avcodec.h"

#if HAVE_SYS_RESOURCE_H

#include

#include

#include

#elif HAVE_GETPROCESSTIMES

#include

#endif

#if HAVE_GETPROCESSMEMORYINFO

#include

#include

#endif

#if HAVE_SYS_SELECT_H

#include

#endif

#if HAVE_TERMIOS_H

#include

#include

#include

#include

#elif HAVE_KBHIT

#include

#endif

#if HAVE_PTHREADS

#include

#endif

#include

#include "libavutil/avassert.h"

#define MAX_LEN 1024 * 50

int main()

{

//下面初始化h264解码库

//avcodec_init();

av_register_all();

avcodec_register_all();

/* find the video encoder */

AVCodec *videoCodec = avcodec_find_encoder(CODEC_ID_H264);//得到264的编码器类

if(!videoCodec)

{

printf("avcodec_find_decoder error\n");

return -1;

}

/*AVCodecParserContext *avParserContext = av_parser_init(CODEC_ID_H264);//得到解析帧类,主要用于后面的帧头查找

if(!avParserContext)

{

printf("av_parser_init error\n");

return -1;

}*/

AVCodecContext *codec_ = avcodec_alloc_context3(videoCodec);//编码会话层

if(!codec_)

{

printf("avcodec_alloc_context3 error\n");

return -1;

}

//初始化参数,下面的参数应该由具体的业务决定

codec_->time_base.num = 1;

codec_->time_base.den = 25;//帧率

codec_->gop_size = 1;

codec_->max_b_frames = 1;

codec_->thread_count = 1;

codec_->pix_fmt = PIX_FMT_YUV420P;

//codec_->frame_number = 1; //每包一个视频帧

//codec_->codec_type = AVMEDIA_TYPE_VIDEO;

codec_->bit_rate = 1000000;

codec_->width = 720;//视频宽

codec_->height = 576;//视频高

if(avcodec_open2(codec_, videoCodec, NULL) < 0)//打开编码器

{

printf("avcodec_open2 error\n");

return -1;

}

FILE *myH264 = fopen("t.264", "wb");

if(myH264 == NULL)

{

perror("cant open 264 file\n");

return -1;

}

FILE *yuvfile = fopen("my264.yuv", "rb");

if(yuvfile == NULL)

{

perror("cant open YUV file\n");

return -1;

}

int readFileLen = 1;

char readBuf[MAX_LEN];

printf("readBuf address is %x\n", readBuf);

//

int outbuf_size=100000;

unsigned char * outbuf= malloc(outbuf_size);

int u_size=0;

AVPacket avpkt;

unsigned char * yuv_buf= malloc(720*576*3/2);

AVFrame *m_pYUVFrame=malloc(sizeof(AVFrame));

int flag=0;

while(1)

{

int len = fread(yuv_buf,720*576*3/2,1,yuvfile);

if(len<=0)

{

printf("read over\n");

break;

}

else

{

avpicture_fill((AVPicture*)m_pYUVFrame,(unsigned char *)yuv_buf,PIX_FMT_YUV420P,720,576);

int got_packet_ptr =0;

av_init_packet(&avpkt);

avpkt.data=outbuf;

avpkt.size=outbuf_size;

while(1)

{

u_size = avcodec_encode_video(codec_,outbuf,outbuf_size,m_pYUVFrame);

if(u_size>0 && u_size<100000)

{

m_pYUVFrame->pts++;

fwrite(avpkt.data,1,u_size,myH264);

flag++;

break;

}

}

}

// if(flag>20)break;

}

avcodec_close(codec_);

av_free(codec_);

fclose(yuvfile);

fclose(myH264);

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值