概述
-
/*
-
* 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
-
*/
-
#include <stdlib.h>
-
#include <stdio.h>
-
#include <string.h>
-
-
#ifdef HAVE_AV_CONFIG_H
-
#undef HAVE_AV_CONFIG_H
-
#endif
-
-
#include "libavcodec/avcodec.h"
-
#include "libavutil/mathematics.h"
-
-
#define INBUF_SIZE 4096
-
#define AUDIO_INBUF_SIZE 20480
-
#define AUDIO_REFILL_THRESH 4096
-
-
/*
-
* Video encoding example
-
*/
-
static void video_encode_example ( const char *filename )
-
{
-
AVCodec *codec ;
-
AVCodecContext *c = NULL ;
-
int i , out_size , size , x , y , outbuf_size ;
-
FILE *f ;
-
AVFrame *picture ;
-
uint8_t *outbuf , *picture_buf ;
-
-
printf ( "Video encodingn" ) ;
-
-
/* find the mpeg1 video encoder */
-
codec = avcodec_find_encoder (CODEC_ID_VP8 ) ;
-
if ( !codec ) {
-
fprintf (stderr , "codec not foundn" ) ;
-
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 = (AVRational ) {1 ,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 codecn" ) ;
-
exit (1 ) ;
-
}
-
-
f = fopen (filename , "wb" ) ;
-
if ( !f ) {
-
fprintf (stderr , "could not open %sn" , 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 ;
-
-
/* encode 1 second of video */
-
for (i = 0 ;i < 25 ;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 ;
-
}
-
}
-
-
/* encode the image */
-
out_size = avcodec_encode_video (c , outbuf , outbuf_size , picture ) ;
-
printf ( "encoding frame %3d (size=%5d)n" , i , out_size ) ;
-
fwrite (outbuf , 1 , out_size , f ) ;
-
}
-
-
/* get the delayed frames */
-
/*for(; out_size; i++) {
-
fflush(stdout);
-
-
out_size = avcodec_encode_video(c, outbuf, outbuf_size, NULL);
-
printf("write frame %3d (size=%5d)n", i, out_size);
-
fwrite(outbuf, 1, out_size, f);
-
}*/
-
-
/* add sequence end code to have a real mpeg file */
-
/*outbuf[0] = 0x00;
-
outbuf[1] = 0x00;
-
outbuf[2] = 0x01;
-
outbuf[3] = 0xb7;
-
fwrite(outbuf, 1, 4, f);*/
-
-
fclose (f ) ;
-
free (picture_buf ) ;
-
free (outbuf ) ;
-
-
avcodec_close (c ) ;
-
av_free (c ) ;
-
av_free (picture ) ;
-
printf ( "n" ) ;
-
}
-
-
原文地址
-
-
int main ( int argc , char **argv )
-
{
-
const char *filename ;
-
-
/* must be called before using avcodec lib */
-
avcodec_init ( ) ;
-
-
/* register all the codecs */
-
avcodec_register_all ( ) ;
-
-
video_encode_example ( "testa.webm" ) ;
-
-
return 0 ;
-
}
最后
以上就是粗心纸鹤为你收集整理的ffmpeg使用vp8编解码的全部内容,希望文章能够帮你解决ffmpeg使用vp8编解码所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复