您的位置:首页 > 运维架构 > Linux

嵌入式linux------ffmpeg移植 编码H264(am335x编码H264)

2015-08-04 09:34 585 查看
[cpp] view plaincopy<pre name="code" class="cpp"><pre name="code" class="cpp">/*
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 H***E_SYS_RESOURCE_H
#include <sys/time.h>
#include <sys/types.h>
#include <sys/resource.h>
#elif H***E_GETPROCESSTIMES
#include <windows.h>
#endif
#if H***E_GETPROCESSMEMORYINFO
#include <windows.h>
#include <psapi.h>
#endif

#if H***E_SYS_SELECT_H
#include <sys/select.h>
#endif

#if H***E_TERMIOS_H
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/time.h>
#include <termios.h>
#elif H***E_KBHIT
#include <conio.h>
#endif

#if H***E_PTHREADS
#include <pthread.h>
#endif

#include <time.h>

#include "libavutil/avassert.h"

#define MAX_LEN 1024 * 50


int main()
{
//下面初始化h264解码库
//avcodec_init();
av_register_all();
avcodec_register_all();


/* find the video encoder */
***Codec *videoCodec = avcodec_find_encoder(CODEC_ID_H264);//得到264的编码器类
if(!videoCodec)
{
printf("avcodec_find_decoder error\n");
return -1;
}

/****CodecParserContext *avParserContext = av_parser_init(CODEC_ID_H264);//得到解析帧类,主要用于后面的帧头查找
if(!avParserContext)
{
printf("av_parser_init error\n");
return -1;
}*/
***CodecContext *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 = ***MEDIA_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;
***Packet avpkt;
unsigned char * yuv_buf= malloc(720*576*3/2);
***Frame *m_pYUVFrame=malloc(sizeof(***Frame));
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((***Picture*)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);

}


</pre><br><br></pre>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: