码迷,mamicode.com
首页 > 系统相关 > 详细

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

时间:2015-08-01 13:01:05      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:

/*
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 <sys/time.h>
#include <sys/types.h>
#include <sys/resource.h>
#elif HAVE_GETPROCESSTIMES
#include <windows.h>
#endif
#if HAVE_GETPROCESSMEMORYINFO
#include <windows.h>
#include <psapi.h>
#endif

#if HAVE_SYS_SELECT_H
#include <sys/select.h>
#endif

#if HAVE_TERMIOS_H
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/time.h>
#include <termios.h>
#elif HAVE_KBHIT
#include <conio.h>
#endif

#if HAVE_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 */
	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);
	
}




版权声明:本文为博主原创文章,未经博主允许不得转载。

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

标签:

原文地址:http://blog.csdn.net/mao0514/article/details/47184843

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!