/*
* copyright (c) 2001 Fabrice Bellard
*
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
/**
* @file apiexample.c
* avcodec API use example.
*
* Note that this library only handles codecs (mpeg, mpeg4, etc...),
* not file formats (avi, vob, etc...). See library 'libavformat' for the
* format handling
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#ifdef HAVE_AV_CONFIG_H
#undef HAVE_AV_CONFIG_H
#endif
#include "avcodec.h"
#define INBUF_SIZE 4096
/*
* Audio encoding example
*/
// void audio_encode_example(const char *filename)
// {
// AVCodec *codec;
// AVCodecContext *c= NULL;
// int frame_size, i, j, out_size, outbuf_size;
// FILE *f;
// short *samples;
// float t, tincr;
// uint8_t *outbuf;
//
// printf("Audio encoding\n");
//
// /* find the MP2 encoder */
// codec = avcodec_find_encoder(CODEC_ID_MP2);
// if (!codec) {
// fprintf(stderr, "codec not found\n");
// exit(1);
// }
//
// c= avcodec_alloc_context();
//
// /* put sample parameters */
// c->bit_rate = 64000;
// c->sample_rate = 44100;
// c->channels = 2;
//
// /* open it */
// if (avcodec_open(c, codec) < 0) {
// fprintf(stderr, "could not open codec\n");
// exit(1);
// }
//
// /* the codec gives us the frame size, in samples */
// frame_size = c->frame_size;
// samples = malloc(frame_size * 2 * c->channels);
// outbuf_size = 10000;
// outbuf = malloc(outbuf_size);
//
// f = fopen(filename, "wb");
// if (!f) {
// fprintf(stderr, "could not open %s\n", filename);
// exit(1);
// }
//
// /* encode a single tone sound */
// t = 0;
// tincr = 2 * M_PI * 440.0 / c->sample_rate;
// for(i=0;i<200;i++) {
// for(j=0;j<frame_size;j++) {
// samples[2*j] = (int)(sin(t) * 10000);
// samples[2*j+1] = samples[2*j];
// t += tincr;
// }
// /* encode the samples */
// out_size = avcodec_encode_audio(c, outbuf, outbuf_size, samples);
// fwrite(outbuf, 1, out_size, f);
// }
// fclose(f);
// free(outbuf);
// free(samples);
//
// avcodec_close(c);
// av_free(c);
// }
/*
* Audio decoding.
*/
void audio_decode_example(const char *outfilename, const char *filename)
{
AVCodec *codec;
AVCodecContext *c= NULL;
int out_size, size, len;
FILE *f, *outfile;
uint8_t *outbuf;
uint8_t inbuf[INBUF_SIZE + FF_INPUT_BUFFER_PADDING_SIZE], *inbuf_ptr;
printf("Audio decoding\n");
/* set end of buffer to 0 (this ensures that no overreading happens for damaged mpeg streams) */
memset(inbuf + INBUF_SIZE, 0, FF_INPUT_BUFFER_PADDING_SIZE);
/* find the mpeg audio decoder */
codec = avcodec_find_decoder(CODEC_ID_MP2);
if (!codec) {
fprintf(stderr, "codec not found\n");
exit(1);
}
c= avcodec_alloc_context();
/* open it */
if (avcodec_open(c, codec) < 0) {
fprintf(stderr, "could not open codec\n");
exit(1);
}
outbuf = malloc(AVCODEC_MAX_AUDIO_FRAME_SIZE);
f = fopen(filename, "rb");
if (!f) {
fprintf(stderr, "could not open %s\n", filename);
exit(1);
}
outfile = fopen(outfilename, "wb");
if (!outfile) {
av_free(c);
exit(1);
}
/* decode until eof */
inbuf_ptr = inbuf;
for(;;) {
size = fread(inbuf, 1, INBUF_SIZE, f);
if (size == 0)
break;
inbuf_ptr = inbuf;
while (size > 0) {
len = avcodec_decode_audio(c, (short *)outbuf, &out_size,
inbuf_ptr, size);
if (len < 0) {
fprintf(stderr, "Error while decoding\n");
exit(1);
}
if (out_size > 0) {
/* if a frame has been decoded, output it */
fwrite(outbuf, 1, out_size, outfile);
}
size -= len;
inbuf_ptr += len;
}
}
fclose(outfile);
fclose(f);
free(outbuf);
avcodec_close(c);
av_free(c);
}
static void read_yuv_fromfile(AVFrame *picture, int width, int height, FILE *f)
{
int luma_size;
int chroma_size;
luma_size = width*height;
chroma_size= luma_size>>2;
fread(picture->data[0], 1, luma_size, f);
fread(picture->data[1], 1, chroma_size, f);
fread(picture->data[2], 1, chroma_size, f);
}
/*
* Video encoding example
*/
void video_encode_example(const char *filename, const char *YUVfile)
{
AVCodec *codec;
AVCodecContext *c= NULL;
int i, out_size, size, x, y, outbuf_size;
FILE *f;
FILE *fpYUV;
AVFrame *picture;
uint8_t *outbuf, *picture_buf;
printf("Video encoding\n");
/* find the mpeg1 video encoder */
codec = avcodec_find_encoder(CODEC_ID_H264);
if (!codec) {
fprintf(stderr, "codec not found\n");
exit(1);
}
c= avcodec_alloc_context();
picture= avcodec_alloc_frame();
/* put sample parameters */
c->bit_rate = 400000;
/* resolution must be a multiple of two */
c->width = 352;
c->height = 288;
/* frames per second */
c->time_base.num = 1;
c->time_base.den = 25;
c->gop_size = 10; /* emit one intra frame every ten frames */
c->max_b_frames=1;
c->pix_fmt = PIX_FMT_YUV420P;
/* open it */
if (avcodec_open(c, codec) < 0) {
fprintf(stderr, "could not open codec\n");
exit(1);
}
/* the codec gives us the frame size, in samples */
f = fopen(filename, "wb");
if (!f) {
fprintf(stderr, "could not open %s\n", filename);
exit(1);
}
/* alloc image and output buffer */
outbuf_size = 100000;
outbuf = malloc(outbuf_size);
size = c->width * c->height;
picture_buf = malloc((size * 3) / 2); /* size for YUV 420 */
picture->data[0] = picture_buf;
picture->data[1] = picture->data[0] + size;
picture->data[2] = picture->data[1] + size / 4;
picture->linesize[0] = c->width;
picture->linesize[1] = c->width / 2;
picture->linesize[2] = c->width / 2;
fpYUV = fopen(YUVfile, "rb");
if (!fpYUV) {
fprintf(stderr, "could not open %s\n", filename);
exit(1);
}
/* encode 1 second of video */
for(i=0;i<300;i++) {
fflush(stdout);
// /* prepare a dummy image */
// /* Y */
// for(y=0;y<c->height;y++) {
// for(x=0;x<c->width;x++) {
// picture->data[0][y * picture->linesize[0] + x] = x + y + i * 3;
// }
// }
//
// /* Cb and Cr */
// for(y=0;y<c->height/2;y++) {
// for(x=0;x<c->width/2;x++) {
// picture->data[1][y * picture->linesize[1] + x] = 128 + y + i * 2;
// picture->data[2][y * picture->linesize[2] + x] = 64 + x + i * 5;
// }
// }
read_yuv_fromfile(picture
没有合适的资源?快使用搜索试试~ 我知道了~
vc调用ffmpeg进行x264视频编码
共55个文件
h:27个
dll:6个
lib:3个
5星 · 超过95%的资源 需积分: 9 138 下载量 123 浏览量
2013-02-24
04:12:05
上传
评论
收藏 29.63MB RAR 举报
温馨提示
调用ffmpeg把yuv视频x264视频编码,可以用暴风影音播放,在vc6。0下编译通过
资源推荐
资源详情
资源评论
收起资源包目录
vc下调用ffmpeg进行x264编码.rar (55个子文件)
新建文件夹 (3)
avformat.lib 62KB
Debug
ceshi.bsc 137KB
vc60.pdb 52KB
ceshi.pch 303KB
ceshi.ilk 205KB
ceshi.pdb 457KB
ceshi.exe 180KB
avutil.dll 28KB
apiexample.obj 12KB
vc60.idb 41KB
avformat.dll 472KB
avcodec.dll 6.85MB
test.264 734KB
test.mp4 734KB
apiexample.sbr 44KB
1.yuv 43.51MB
avcodec.lib 507KB
avutil.dll 28KB
ceshi.dsw 535B
ceshi.plg 2KB
avformat.dll 472KB
avcodec.dll 6.85MB
test
test.264 988KB
ceshi.opt 337KB
ceshi.ncb 121KB
ceshi.dsp 5KB
avutil.lib 14KB
apiexample.c 14KB
include
lzo.h 1KB
base64.h 1KB
rtp.h 4KB
mathematics.h 2KB
log.h 4KB
avstring.h 3KB
mem.h 2KB
rgb2rgb.h 7KB
fifo.h 3KB
inttypes.h 5KB
allcodecs.h 9KB
common.h 10KB
avutil.h 6KB
swscale.h 5KB
rtsp.h 3KB
integer.h 2KB
opt.h 3KB
stdint.h 5KB
rtspcodes.h 2KB
random.h 2KB
avio.h 9KB
md5.h 1KB
rational.h 3KB
avcodec.h 93KB
avformat.h 32KB
intfloat_readwrite.h 1KB
adler32.h 993B
共 55 条
- 1
djjianfeng
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
前往页