ffmpeg+vs 2017 설정 및 코드 예시

6993 단어
준비 환경:
1、
https://ffmpeg.zeranoe.com/builds/
Shared 및 Dev 개발 패키지 다운로드
2、vs2017
단계:
1. 프로젝트 만들기
2. dev에서include 및lib에서 프로젝트로, Shared에서 dll에서 프로젝트로
3. 프로젝트 구성에 include 및lib 추가
참고: 온라인 방법에 따라 dll 컴파일을 추가하면 실패합니다.
1、무언가를 보고하는 것 같습니다.dll의 잘못을 찾을 수 없습니까 아니면 무슨 잘못을 찾을 수 없습니까
2、
FFmpeg이 거부된 솔루션으로 선언됨
1 해결 방법
온라인 방법은 링크 -> 입력 -> 첨부 파일 의존 항목
이 단계는 필요 없습니다. 코드에 링크를 선언하는 것으로 바꿉니다. 다음과 같습니다.
#pragma comment(lib , "avcodec.lib")
#pragma comment(lib , "avdevice.lib")
#pragma comment(lib , "avfilter.lib")
#pragma comment(lib , "avformat.lib")
#pragma comment(lib , "avutil.lib")
#pragma comment(lib , "postproc.lib")
#pragma comment(lib , "swresample.lib")
#pragma comment(lib , "swscale.lib")

2. 해결 방법
뇌신 블로그에 ffmpeg의 예가 있는데 사용하는 ffmpeg가 비교적 새롭다.api가 업데이트되었다. 예는 중국의api가 미래에 삭제될 수 있다. 여기에 두 가지 해결 방법이 있다.
1) c/c++ 중 sdl 체크가 위험한지 확인, 권장하지 않음
2) 호출 인터페이스 교체:
avcodec_decode_비디오2를 avcodec 로 바꾸기send_packet
예는 다음과 같다(뇌신판에서 수정)
// ffmpeg_test.cpp:              。
//
#include "stdafx.h"
#include 

#define __STDC_CONSTANT_MACROS

#pragma comment(lib , "avcodec.lib")
#pragma comment(lib , "avdevice.lib")
#pragma comment(lib , "avfilter.lib")
#pragma comment(lib , "avformat.lib")
#pragma comment(lib , "avutil.lib")
#pragma comment(lib , "postproc.lib")
#pragma comment(lib , "swresample.lib")
#pragma comment(lib , "swscale.lib")


extern "C"
{
#include "libavcodec/avcodec.h"
};

#define TEST_H264  1
#define TEST_HEVC  0

int main(int argc, char* argv[])
{
#if 1
	AVCodec *pCodec;
	AVCodecContext *pCodecCtx = NULL;
	AVCodecParserContext *pCodecParserCtx = NULL;

	FILE *fp_in;
	FILE *fp_out;
	AVFrame	*pFrame;

	const int in_buffer_size = 4096;
	unsigned char in_buffer[in_buffer_size + FF_INPUT_BUFFER_PADDING_SIZE] = { 0 };
	unsigned char *cur_ptr;
	int cur_size;
	AVPacket packet;
	int ret, got_picture;


#if TEST_HEVC
	enum AVCodecID codec_id = AV_CODEC_ID_HEVC;
	char filepath_in[] = "bigbuckbunny_480x272.hevc";
#elif TEST_H264
	AVCodecID codec_id = AV_CODEC_ID_H264;
	char filepath_in[] = "bigbuckbunny_480x272.h264";
#else
	AVCodecID codec_id = AV_CODEC_ID_MPEG2VIDEO;
	char filepath_in[] = "bigbuckbunny_480x272.m2v";
#endif

	char filepath_out[] = "bigbuckbunny1_480x272.yuv";
	int first_time = 1;


	//av_log_set_level(AV_LOG_DEBUG);

	avcodec_register_all();

	pCodec = avcodec_find_decoder(codec_id);
	if (!pCodec) {
		printf("Codec not found
"); return -1; } pCodecCtx = avcodec_alloc_context3(pCodec); if (!pCodecCtx) { printf("Could not allocate video codec context
"); return -1; } pCodecParserCtx = av_parser_init(codec_id); if (!pCodecParserCtx) { printf("Could not allocate video parser context
"); return -1; } //if(pCodec->capabilities&CODEC_CAP_TRUNCATED) // pCodecCtx->flags|= CODEC_FLAG_TRUNCATED; if (avcodec_open2(pCodecCtx, pCodec, NULL) < 0) { printf("Could not open codec
"); return -1; } //Input File fp_in = fopen(filepath_in, "rb"); if (!fp_in) { printf("Could not open input stream
"); return -1; } //Output File fp_out = fopen(filepath_out, "wb"); if (!fp_out) { printf("Could not open output YUV file
"); return -1; } pFrame = av_frame_alloc(); av_init_packet(&packet); while (1) { cur_size = (int)fread(in_buffer, 1, in_buffer_size, fp_in); if (cur_size == 0) break; cur_ptr = in_buffer; while (cur_size>0) { int len = av_parser_parse2( pCodecParserCtx, pCodecCtx, &packet.data, &packet.size, cur_ptr, cur_size, AV_NOPTS_VALUE, AV_NOPTS_VALUE, AV_NOPTS_VALUE); cur_ptr += len; cur_size -= len; if (packet.size == 0) continue; //Some Info from AVCodecParserContext printf("[Packet]Size:%6d\t", packet.size); switch (pCodecParserCtx->pict_type) { case AV_PICTURE_TYPE_I: printf("Type:I\t"); break; case AV_PICTURE_TYPE_P: printf("Type:P\t"); break; case AV_PICTURE_TYPE_B: printf("Type:B\t"); break; default: printf("Type:Other\t"); break; } printf("Number:%4d
", pCodecParserCtx->output_picture_number); //ret = avcodec_decode_video2(pCodecCtx, pFrame, &got_picture, &packet); ret = avcodec_send_packet(pCodecCtx, &packet); if (ret != 0) { printf("send pkt error.
"); return ret; } ret = avcodec_receive_frame/(pCodecCtx, pFrame) if(ret == 0) { if (first_time) { printf("
Codec Full Name:%s
", pCodecCtx->codec->long_name); printf("width:%d
height:%d

", pCodecCtx->width, pCodecCtx->height); first_time = 0; } //Y, U, V for (int i = 0; iheight; i++) { fwrite(pFrame->data[0] + pFrame->linesize[0] * i, 1, pFrame->width, fp_out); } for (int i = 0; iheight / 2; i++) { fwrite(pFrame->data[1] + pFrame->linesize[1] * i, 1, pFrame->width / 2, fp_out); } for (int i = 0; iheight / 2; i++) { fwrite(pFrame->data[2] + pFrame->linesize[2] * i, 1, pFrame->width / 2, fp_out); } printf("Succeed to decode 1 frame!
"); }                         else if (ret < 0)                         {                             //printf("%s
",str2_to_string(ret));                             //str2_to_string                             // vs , error                         }                 }         } //Flush Decoder packet.data = NULL; packet.size = 0; while (1) { //ret = avcodec_decode_video2(pCodecCtx, pFrame, &got_picture, &packet); ret = avcodec_send_packet(pCodecCtx, &packet); if (ret != 0) { printf("send pkt error.
"); return ret; } while(avcodec_receive_frame(pCodecCtx, pFrame) == 0) { //Y, U, V for (int i = 0; iheight; i++) { fwrite(pFrame->data[0] + pFrame->linesize[0] * i, 1, pFrame->width, fp_out); } for (int i = 0; iheight / 2; i++) { fwrite(pFrame->data[1] + pFrame->linesize[1] * i, 1, pFrame->width / 2, fp_out); } for (int i = 0; iheight / 2; i++) { fwrite(pFrame->data[2] + pFrame->linesize[2] * i, 1, pFrame->width / 2, fp_out); } printf("Flush Decoder: Succeed to decode 1 frame!
"); } } fclose(fp_in); fclose(fp_out); av_parser_close(pCodecParserCtx); av_frame_free(&pFrame); avcodec_close(pCodecCtx); av_free(pCodecCtx); #else avcodec_register_all(); #endif return 0; }

좋은 웹페이지 즐겨찾기