嵌入式linux------ffmpeg移植 編碼H264(am335x編碼H264),ffmpegh264
/*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 * 50int 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);}
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。