ffmpeg开发笔记

1. 测试代码:
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
#include <libswresample/swresample.h>
#include <stdio.h>


void SaveFrame(AVFrame *pFrame, int width, int height, int iFrame) {
	FILE *pFile;
	char szFilename[32];
	int y;
	printf("start sws_scale\n");
// Open file
 	sprintf(szFilename, "frame%d.ppm", iFrame);
	pFile=fopen(szFilename, "wb");
	if(pFile==NULL){
		printf("pFile is null");
		return;
	}
	fprintf(pFile, "P6\n%d %d\n255\n", width, height);
	for(y=0; y<height; y++)
		fwrite(pFrame->data[0]+y*pFrame->linesize[0], 1, width*3, pFile);
	fclose(pFile);
}



int main (int argc, char **argv)
{
    AVFormatContext *fmt_ctx = NULL;
    AVDictionaryEntry *tag = NULL;
    int ret;

    if (argc != 2) {
        printf("usage: %s <input_file>\n"
               "example program to demonstrate the use of the libavformat metadata API.\n"
               "\n", argv[0]);
        return 1;
    }

    av_register_all();
    if ((ret = avformat_open_input(&fmt_ctx, argv[1], NULL, NULL)))
        return ret;
	
	if(avformat_find_stream_info(fmt_ctx, NULL)<0)
    	return 1;
	av_dump_format(fmt_ctx, 0, argv[1], 0);
	int i;
	int videoStream = -1;
	for(i=0;i<fmt_ctx->nb_streams; i++) {
		if(fmt_ctx->streams[i]->codec->codec_type==AVMEDIA_TYPE_VIDEO) {
			videoStream=i;
			break;
		}
	}	
	printf("videoStream: %d\n", videoStream);
	if(videoStream == -1) return 1;
	
	AVCodecContext *pCodecCtx;
	pCodecCtx = fmt_ctx->streams[videoStream]->codec;
	AVCodec *pCodec=avcodec_find_decoder(pCodecCtx->codec_id);
	
	if(pCodec==NULL) {
		fprintf(stderr, "Unsupported codec!\n");
		return -1; // Codec not found
	}
	// Open codec
 	if(avcodec_open2(pCodecCtx, pCodec, NULL)<0) return -1; // Could not open codec	
	fprintf(stdout, "open stream, codec_id:%d\n", pCodecCtx->codec_id);

	AVFrame *pFrame;
	pFrame=av_frame_alloc();

	//保存frame
	AVFrame *pFrameRGB;
	pFrameRGB=av_frame_alloc();
	if(pFrameRGB==NULL)  return -1;
	uint8_t *buffer;
	int numBytes;
	numBytes=avpicture_get_size(PIX_FMT_RGB24, pCodecCtx->width, pCodecCtx->height);
	buffer=(uint8_t *)av_malloc(numBytes*sizeof(uint8_t));
	avpicture_fill((AVPicture *)pFrameRGB, buffer, PIX_FMT_RGB24, pCodecCtx->width, pCodecCtx->height);


	int frameFinished;
	AVPacket packet;
	i=0;
	while(av_read_frame(fmt_ctx, &packet)>=0){
		if(packet.stream_index==videoStream) {	
			int result;
			avcodec_decode_video2(pCodecCtx,pFrame,&frameFinished, &packet);		
			if(frameFinished) {
				struct SwsContext *img_convert_ctx = sws_getContext(pCodecCtx->width, pCodecCtx->height, pCodecCtx->pix_fmt, pCodecCtx->width,
				pCodecCtx->height, PIX_FMT_RGB24, SWS_BICUBIC,NULL, NULL,NULL);
				result = sws_scale(img_convert_ctx, (const uint8_t* const*)pFrame->data, pFrame->linesize,
								0, pCodecCtx->height, pFrameRGB->data, pFrameRGB->linesize);
				printf("get result is %d~~~~~~~~~\n",result);
				// Save the frame to disk
				printf("i is %d \n",i);			
				if(++i<=5){
					SaveFrame(pFrameRGB, pCodecCtx->width, pCodecCtx->height, i);
				}
			}
		}
		av_free_packet(&packet);
	}
	return 0;
}


 2. 编译命令 

     gcc test.c -o test  -L/usr/local/ffmpeg/lib -lavcodec -lavformat -lavutil -lswresample -lswscale

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值