ffmpeg+vs 2017 설정 및 코드 예시
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;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.