Vote count:
0
I'm trying to change the camera output(Resolution:640 x 480),to 1024 x 720 and render the video frames in the Android screen.Is it possible to do this video conversion with ffmpeg and SDL libraries?If so is there any API's avaliable in ffmepeg codec libraries to do the same?
Here is the code where i got the output for 640 x 480 resolution:
//Registering all the formats:
av_register_all();
AVFormatContext *pFormatCtx=NULL;
int i, videoStream;
AVCodecContext *pCodecCtx=NULL;
AVCodec *pCodec=NULL;
AVFrame *pFrame;
AVPacket packet;
int frameFinished;
SDL_Texture *bmp;
SDL_Renderer *renderer;
SDL_Window *screen;
if (SDL_Init(SDL_INIT_VIDEO)) {
LOGD( "Could not initialize SDL - %s\n", SDL_GetError());
SDL_Quit();
exit(1);
}
LOGD(" SDL Initialized..");
screen = SDL_CreateWindow("Window", SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED, 0, 0,
SDL_WINDOW_SHOWN | SDL_WINDOW_FULLSCREEN);
LOGD("SDL Screen Created ..");
renderer = SDL_CreateRenderer(screen,-1,SDL_RENDERER_ACCELERATED | SDL_RENDERER_TARGETTEXTURE);
LOGD("Rendering Created...");
bmp = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_IYUV,SDL_TEXTUREACCESS_STREAMING,640,480);
LOGD("Texture created;");
SDL_RenderSetLogicalSize(renderer,640,480);
// Open video file
if(avformat_open_input(&pFormatCtx,"Filename", NULL,NULL)!=0)
LOGD("Cannot open the File");
pFormatCtx->interrupt_callback.callback = decode_interrupt_cb;
// Retrieve stream information
if(avformat_find_stream_info(pFormatCtx,NULL)<0)
LOGD("Cannot retrive Stream info");
// Couldn't find stream information
videoStream=-1;
for(i=0; i<pFormatCtx->nb_streams; i++)
if(pFormatCtx->streams[i]->codec->codec_type==AVMEDIA_TYPE_VIDEO) {
videoStream=i;
break;
}
if(videoStream==-1)
LOGD("Cannot find Video Stream:");
pCodecCtx=pFormatCtx->streams[videoStream]->codec;
// Find the decoder for the video stream
pCodec=avcodec_find_decoder(pCodecCtx->codec_id);
if(pCodec==NULL) {
fprintf(stderr, "Unsupported codec!\n");
LOGD("Unable to find the decoder");
// Codec not found
}
// Open codec
if(avcodec_open2(pCodecCtx, pCodec,NULL)<0)
LOGD("Unable to OPEN Codec");
// Could not open codec
// Allocate video frame
pFrame=avcodec_alloc_frame();
i=0;
while(av_read_frame(pFormatCtx, &packet)>=0) {
// Is this a packet from the video stream?
if(packet.stream_index==videoStream) {
// Decode video frame
avcodec_decode_video2(pCodecCtx, pFrame, &frameFinished,&packet);
// Did we get a video frame?
if(frameFinished) {
//----------------Code for Displaying
SDL_UpdateYUVTexture(bmp, NULL, pFrame->data[0],
pFrame->linesize[0], pFrame->data[1], pFrame->linesize[1],
pFrame->data[2], pFrame->linesize[2]);
retcl = SDL_RenderClear(renderer);
retcopy = SDL_RenderCopy(renderer, bmp, NULL, NULL);
SDL_RenderPresent(renderer);
//-----------------
}
}
// Free the packet that was allocated by av_read_frame
av_free_packet(&packet);
}
// Free the RGB image
av_free(buffer);
// Free the YUV frame
av_free(pFrame);
// Close the codec
avcodec_close(pCodecCtx);
// Close the video file
avformat_close_input(&pFormatCtx);
return 0;
}
asked 1 min ago
Changing Resolution in ffmpeg output to display video stream in Android
Aucun commentaire:
Enregistrer un commentaire