亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? tutorial04.c

?? ffmpeg開發指南
?? C
?? 第 1 頁 / 共 2 頁
字號:
// tutorial04.c// A pedagogical video player that will stream through every video frame as fast as it can,// and play audio (out of sync).//// Code based on FFplay, Copyright (c) 2003 Fabrice Bellard, // and a tutorial by Martin Bohme (boehme@inb.uni-luebeckREMOVETHIS.de)// Tested on Gentoo, CVS version 5/01/07 compiled with GCC 4.1.1// Use//// gcc -o tutorial04 tutorial04.c -lavutil -lavformat -lavcodec -lz -lm `sdl-config --cflags --libs`// to build (assuming libavformat and libavcodec are correctly installed, // and assuming you have sdl-config. Please refer to SDL docs for your installation.)//// Run using// tutorial04 myvideofile.mpg//// to play the video stream on your screen.#include <avcodec.h>#include <avformat.h>#include <SDL.h>#include <SDL_thread.h>#ifdef __MINGW32__#undef main /* Prevents SDL from overriding main() */#endif#include <stdio.h>#include <math.h>#define SDL_AUDIO_BUFFER_SIZE 1024#define MAX_AUDIOQ_SIZE (5 * 16 * 1024)#define MAX_VIDEOQ_SIZE (5 * 256 * 1024)#define FF_ALLOC_EVENT   (SDL_USEREVENT)#define FF_REFRESH_EVENT (SDL_USEREVENT + 1)#define FF_QUIT_EVENT (SDL_USEREVENT + 2)#define VIDEO_PICTURE_QUEUE_SIZE 1typedef struct PacketQueue {  AVPacketList *first_pkt, *last_pkt;  int nb_packets;  int size;  SDL_mutex *mutex;  SDL_cond *cond;} PacketQueue;typedef struct VideoPicture {  SDL_Overlay *bmp;  int width, height; /* source height & width */  int allocated;} VideoPicture;typedef struct VideoState {  AVFormatContext *pFormatCtx;  int             videoStream, audioStream;  AVStream        *audio_st;  PacketQueue     audioq;  uint8_t         audio_buf[(AVCODEC_MAX_AUDIO_FRAME_SIZE * 3) / 2];  unsigned int    audio_buf_size;  unsigned int    audio_buf_index;  AVPacket        audio_pkt;  uint8_t         *audio_pkt_data;  int             audio_pkt_size;  AVStream        *video_st;  PacketQueue     videoq;  VideoPicture    pictq[VIDEO_PICTURE_QUEUE_SIZE];  int             pictq_size, pictq_rindex, pictq_windex;  SDL_mutex       *pictq_mutex;  SDL_cond        *pictq_cond;    SDL_Thread      *parse_tid;  SDL_Thread      *video_tid;  char            filename[1024];  int             quit;} VideoState;SDL_Surface     *screen;/* Since we only have one decoding thread, the Big Struct   can be global in case we need it. */VideoState *global_video_state;void packet_queue_init(PacketQueue *q) {  memset(q, 0, sizeof(PacketQueue));  q->mutex = SDL_CreateMutex();  q->cond = SDL_CreateCond();}int packet_queue_put(PacketQueue *q, AVPacket *pkt) {  AVPacketList *pkt1;  if(av_dup_packet(pkt) < 0) {    return -1;  }  pkt1 = av_malloc(sizeof(AVPacketList));  if (!pkt1)    return -1;  pkt1->pkt = *pkt;  pkt1->next = NULL;    SDL_LockMutex(q->mutex);  if (!q->last_pkt)    q->first_pkt = pkt1;  else    q->last_pkt->next = pkt1;  q->last_pkt = pkt1;  q->nb_packets++;  q->size += pkt1->pkt.size;  SDL_CondSignal(q->cond);    SDL_UnlockMutex(q->mutex);  return 0;}static int packet_queue_get(PacketQueue *q, AVPacket *pkt, int block){  AVPacketList *pkt1;  int ret;  SDL_LockMutex(q->mutex);    for(;;) {        if(global_video_state->quit) {      ret = -1;      break;    }    pkt1 = q->first_pkt;    if (pkt1) {      q->first_pkt = pkt1->next;      if (!q->first_pkt)	q->last_pkt = NULL;      q->nb_packets--;      q->size -= pkt1->pkt.size;      *pkt = pkt1->pkt;      av_free(pkt1);      ret = 1;      break;    } else if (!block) {      ret = 0;      break;    } else {      SDL_CondWait(q->cond, q->mutex);    }  }  SDL_UnlockMutex(q->mutex);  return ret;}int audio_decode_frame(VideoState *is, uint8_t *audio_buf, int buf_size) {  int len1, data_size;  AVPacket *pkt = &is->audio_pkt;  for(;;) {    while(is->audio_pkt_size > 0) {      data_size = buf_size;      len1 = avcodec_decode_audio2(is->audio_st->codec, 				  (int16_t *)audio_buf, &data_size, 				  is->audio_pkt_data, is->audio_pkt_size);      if(len1 < 0) {	/* if error, skip frame */	is->audio_pkt_size = 0;	break;      }      is->audio_pkt_data += len1;      is->audio_pkt_size -= len1;      if(data_size <= 0) {	/* No data yet, get more frames */	continue;      }      /* We have data, return it and come back for more later */      return data_size;    }    if(pkt->data)      av_free_packet(pkt);    if(is->quit) {      return -1;    }    /* next packet */    if(packet_queue_get(&is->audioq, pkt, 1) < 0) {      return -1;    }    is->audio_pkt_data = pkt->data;    is->audio_pkt_size = pkt->size;  }}void audio_callback(void *userdata, Uint8 *stream, int len) {  VideoState *is = (VideoState *)userdata;  int len1, audio_size;  while(len > 0) {    if(is->audio_buf_index >= is->audio_buf_size) {      /* We have already sent all our data; get more */      audio_size = audio_decode_frame(is, is->audio_buf, sizeof(is->audio_buf));      if(audio_size < 0) {	/* If error, output silence */	is->audio_buf_size = 1024;	memset(is->audio_buf, 0, is->audio_buf_size);      } else {	is->audio_buf_size = audio_size;      }      is->audio_buf_index = 0;    }    len1 = is->audio_buf_size - is->audio_buf_index;    if(len1 > len)      len1 = len;    memcpy(stream, (uint8_t *)is->audio_buf + is->audio_buf_index, len1);    len -= len1;    stream += len1;    is->audio_buf_index += len1;  }}static Uint32 sdl_refresh_timer_cb(Uint32 interval, void *opaque) {  SDL_Event event;  event.type = FF_REFRESH_EVENT;  event.user.data1 = opaque;  SDL_PushEvent(&event);  return 0; /* 0 means stop timer */}/* schedule a video refresh in 'delay' ms */static void schedule_refresh(VideoState *is, int delay) {  SDL_AddTimer(delay, sdl_refresh_timer_cb, is);}void video_display(VideoState *is) {  SDL_Rect rect;  VideoPicture *vp;  AVPicture pict;  float aspect_ratio;  int w, h, x, y;  int i;  vp = &is->pictq[is->pictq_rindex];  if(vp->bmp) {    if(is->video_st->codec->sample_aspect_ratio.num == 0) {      aspect_ratio = 0;    } else {      aspect_ratio = av_q2d(is->video_st->codec->sample_aspect_ratio) *	is->video_st->codec->width / is->video_st->codec->height;    }    if(aspect_ratio <= 0.0) {      aspect_ratio = (float)is->video_st->codec->width /	(float)is->video_st->codec->height;    }    h = screen->h;    w = ((int)rint(h * aspect_ratio)) & -3;    if(w > screen->w) {      w = screen->w;      h = ((int)rint(w / aspect_ratio)) & -3;    }    x = (screen->w - w) / 2;    y = (screen->h - h) / 2;        rect.x = x;    rect.y = y;    rect.w = w;    rect.h = h;    SDL_DisplayYUVOverlay(vp->bmp, &rect);  }}void video_refresh_timer(void *userdata) {  VideoState *is = (VideoState *)userdata;  VideoPicture *vp;    if(is->video_st) {    if(is->pictq_size == 0) {      schedule_refresh(is, 1);    } else {      vp = &is->pictq[is->pictq_rindex];      /* Now, normally here goes a ton of code	 about timing, etc. we're just going to	 guess at a delay for now. You can	 increase and decrease this value and hard code	 the timing - but I don't suggest that ;)	 We'll learn how to do it for real later.      */      schedule_refresh(is, 80);            /* show the picture! */      video_display(is);            /* update queue for next picture! */      if(++is->pictq_rindex == VIDEO_PICTURE_QUEUE_SIZE) {	is->pictq_rindex = 0;      }      SDL_LockMutex(is->pictq_mutex);      is->pictq_size--;      SDL_CondSignal(is->pictq_cond);      SDL_UnlockMutex(is->pictq_mutex);    }  } else {    schedule_refresh(is, 100);  }}      void alloc_picture(void *userdata) {  VideoState *is = (VideoState *)userdata;  VideoPicture *vp;  vp = &is->pictq[is->pictq_windex];  if(vp->bmp) {    // we already have one make another, bigger/smaller    SDL_FreeYUVOverlay(vp->bmp);  }  // Allocate a place to put our YUV image on that screen  vp->bmp = SDL_CreateYUVOverlay(is->video_st->codec->width,				 is->video_st->codec->height,				 SDL_YV12_OVERLAY,				 screen);  vp->width = is->video_st->codec->width;  vp->height = is->video_st->codec->height;    SDL_LockMutex(is->pictq_mutex);  vp->allocated = 1;  SDL_CondSignal(is->pictq_cond);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91丝袜国产在线播放| 欧美xxxx老人做受| 91九色最新地址| 91一区二区在线观看| 91网站在线播放| 在线观看视频一区二区| 91极品美女在线| 欧美蜜桃一区二区三区| 7777女厕盗摄久久久| 91精品国产综合久久国产大片| 51久久夜色精品国产麻豆| 在线观看91av| 欧美成人乱码一区二区三区| 日韩欧美国产一区二区三区| 精品久久国产97色综合| 26uuu亚洲| 国产精品美女久久久久久2018 | 国产精品视频你懂的| 国产精品日日摸夜夜摸av| 亚洲乱码中文字幕| 日韩在线一区二区| 青青草国产成人av片免费| 韩国精品主播一区二区在线观看| 韩国三级电影一区二区| 99久久综合精品| 欧美日韩在线综合| 欧美一级专区免费大片| 国产日韩精品一区二区浪潮av | 久久精品国产免费看久久精品| 极品尤物av久久免费看| 国产.精品.日韩.另类.中文.在线.播放| caoporen国产精品视频| 欧美揉bbbbb揉bbbbb| 26uuu亚洲综合色| 国产成人啪午夜精品网站男同| 成人在线综合网站| 欧美日韩一区中文字幕| 26uuuu精品一区二区| 亚洲色图视频网站| 欧美aaaaaa午夜精品| www.欧美色图| 91麻豆精品国产91| 国产精品毛片高清在线完整版| 石原莉奈在线亚洲二区| 成人免费看视频| 欧美精品丝袜中出| 国产精品妹子av| 日本不卡高清视频| 91在线视频官网| 精品日韩在线一区| 一区二区高清在线| 国产99久久久国产精品潘金| 欧美日韩日日夜夜| 中文字幕亚洲区| 日本vs亚洲vs韩国一区三区| 91女神在线视频| 久久众筹精品私拍模特| 亚洲bt欧美bt精品777| 成人中文字幕电影| 精品美女在线播放| 亚洲国产精品自拍| 成人在线视频一区二区| 日韩天堂在线观看| 亚洲一级不卡视频| 成人av资源站| 久久久精品国产免费观看同学| 日韩亚洲欧美高清| 亚洲国产精品自拍| 丰满白嫩尤物一区二区| 欧美一区二区三区免费大片| 亚洲欧美日韩电影| 国产成人精品一区二 | 久久综合九色综合欧美亚洲| 亚洲一区二区欧美| 91麻豆.com| 国产精品嫩草久久久久| 麻豆成人91精品二区三区| 色噜噜久久综合| 国产精品久久久久久一区二区三区| 精品一区二区三区影院在线午夜 | 精品国产一区二区在线观看| 亚洲综合免费观看高清完整版在线 | 亚洲综合一区在线| jvid福利写真一区二区三区| 国产亚洲一区字幕| 精品在线免费观看| 日韩欧美一级片| 日韩在线一区二区| 在线播放/欧美激情| 亚洲成人精品在线观看| 在线免费观看日韩欧美| 亚洲美女一区二区三区| 国产亚洲精品bt天堂精选| 久久av老司机精品网站导航| 日韩一卡二卡三卡国产欧美| 日韩av电影一区| 91精品国产综合久久香蕉麻豆| 亚欧色一区w666天堂| 欧美调教femdomvk| 亚洲第一电影网| 欧美日韩mp4| 毛片av一区二区| 精品国产一区二区三区av性色| 理论电影国产精品| 亚洲精品一区二区三区99| 极品少妇xxxx精品少妇偷拍| 久久蜜桃av一区二区天堂| 韩国女主播成人在线观看| 国产三级欧美三级| 成人h动漫精品一区二| 亚洲人成亚洲人成在线观看图片 | 中日韩免费视频中文字幕| 成人激情小说网站| 亚洲欧美日韩国产中文在线| 色哟哟精品一区| 亚洲超碰97人人做人人爱| 欧美精品123区| 看国产成人h片视频| 久久一日本道色综合| 国产精品亚洲а∨天堂免在线| 久久精品在线免费观看| 成人黄色电影在线 | 麻豆国产一区二区| 国产午夜精品一区二区三区嫩草 | 欧美日韩视频专区在线播放| 日精品一区二区三区| 精品免费一区二区三区| 福利一区二区在线| 亚洲人精品一区| 在线综合亚洲欧美在线视频| 国内精品视频一区二区三区八戒 | 国产白丝网站精品污在线入口| 国产精品久久久久婷婷| 日本韩国视频一区二区| 日本视频一区二区| 国产婷婷一区二区| 欧美影视一区二区三区| 久久成人麻豆午夜电影| 18涩涩午夜精品.www| 欧美久久久久中文字幕| 国产成人在线色| 亚洲一区二区欧美| 久久久www成人免费毛片麻豆| 91色视频在线| 久久精品久久久精品美女| 国产精品美女久久久久高潮| 717成人午夜免费福利电影| 国产精品一区二区三区乱码| 亚洲国产一区二区视频| 久久久www免费人成精品| 欧美日韩亚洲综合| 福利一区二区在线| 热久久国产精品| 国产精品电影一区二区三区| 日韩亚洲欧美一区| 日本韩国欧美三级| 国产高清成人在线| 性做久久久久久免费观看| 欧美极品aⅴ影院| 欧美一区二区三区人| av在线一区二区三区| 捆绑调教美女网站视频一区| 亚洲精品第1页| 亚洲国产精品成人综合| 3d成人h动漫网站入口| 91免费国产视频网站| 国产毛片精品国产一区二区三区| 亚洲成人免费看| 亚洲人一二三区| 中文字幕+乱码+中文字幕一区| 久久综合色8888| 不卡一区二区中文字幕| 久久99久久精品欧美| 亚洲国产欧美在线| 中文字幕精品—区二区四季| 精品精品欲导航| 91精品久久久久久蜜臀| 99精品在线观看视频| 精品一区二区三区香蕉蜜桃| 午夜欧美视频在线观看| 亚洲伦在线观看| 国产精品视频观看| 久久久国产一区二区三区四区小说 | 国产麻豆精品在线| 久久精品国产99国产| 丝袜美腿亚洲一区二区图片| 亚洲最新视频在线观看| 亚洲天堂免费看| 国产精品午夜免费| 久久这里都是精品| 欧美电影免费观看高清完整版在| 欧美日韩国产一级片| 欧美在线视频不卡| 色欧美片视频在线观看在线视频| 成人黄页在线观看| av成人免费在线| 成人av网在线| av成人免费在线观看| 成人av免费在线| 99久久免费国产|