如何在Android用FFmpeg解码图像

 我来答
百度网友ca5e28e
推荐于2016-07-27 · TA获得超过7.7万个赞
知道大有可为答主
回答量:1.1万
采纳率:45%
帮助的人:6023万
展开全部

创建一个VideoPicture结构体用来保存解码出来的图像。

/* 
 * SDL_Lesson.c 
 * 
 *  Created on: Aug 12, 2014 
 *      Author: clarck 
 */ 
#include <jni.h> 
#include <android/native_window_jni.h> 
#include "SDL.h" 
#include "SDL_thread.h" 
#include "SDL_events.h" 
#include "../include/logger.h" 
#include "../ffmpeg/include/libavcodec/avcodec.h" 
#include "../ffmpeg/include/libavformat/avformat.h" 
#include "../ffmpeg/include/libavutil/pixfmt.h" 
#include "../ffmpeg/include/libswscale/swscale.h" 
#include "../ffmpeg/include/libswresample/swresample.h" 
    
#define SDL_AUDIO_BUFFER_SIZE 1024 
    
#define MAX_AUDIO_SIZE (5 * 16 * 1024) 
#define MAX_VIDEO_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_P<a href="https://www.baidu.com/s?wd=IC&tn=44039180_cpr&fenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1Y3m1czPyF9uHubujIWm1-90ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6K1TL0qnfK1TL0z5HD0IgF_5y9YIZ0lQzqlpA-bmyt8mh7GuZR8mvqVQL7dugPYpyq8Q1RdPj0Yrjcvnjcdn1T3PWmdn6" target="_blank" class="baidu-highlight">IC</a>TURE_QUEUE_SIZE 1 
#define AVCODEC_MAX_AUDIO_FRAME_SIZE 192000 // 1 second of 48khz 32bit audio 
    
typedef struct PacketQueue { 
    AVPacketList *first_pkt, *last_pkt; 
    int nb_packets; 
    int size; 
    SDL_mutex *mutex; 
    SDL_cond *cond; 
} PacketQueue; 
    
typedef struct VideoP<a href="https://www.baidu.com/s?wd=ic&tn=44039180_cpr&fenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1Y3m1czPyF9uHubujIWm1-90ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6K1TL0qnfK1TL0z5HD0IgF_5y9YIZ0lQzqlpA-bmyt8mh7GuZR8mvqVQL7dugPYpyq8Q1RdPj0Yrjcvnjcdn1T3PWmdn6" target="_blank" class="baidu-highlight">ic</a>ture 
    SDL_Window *screen; 
    SDL_Renderer *renderer; 
    SDL_Texture *bmp; 
    
    AVFrame* rawdata; 
    int width, height; /*source height & width*/ 
    int allocated; 
} VideoPicture; 
    
typedef struct VideoState { 
    char filename[1024]; 
    AVFormatContext *ic; 
    int videoStream, audioStream; 
    AVStream *audio_st; 
    AVFrame *audio_frame; 
    PacketQueue audioq; 
    unsigned int audio_buf_size; 
    unsigned int audio_buf_index; 
    AVPacket audio_pkt; 
    uint8_t *audio_pkt_data; 
    int audio_pkt_size; 
    uint8_t *audio_buf; 
    DECLARE_ALIGNED(16,uint8_t,audio_buf2) [AVCODEC_MAX_AUDIO_FRAME_SIZE * 4]; 
    enum AVSampleFormat audio_src_fmt; 
    enum AVSampleFormat audio_tgt_fmt; 
    int audio_src_channels; 
    int audio_tgt_channels; 
    int64_t audio_src_channel_layout; 
    int64_t audio_tgt_channel_layout; 
    int audio_src_freq; 
    int audio_tgt_freq; 
    struct SwrContext *swr_ctx; 
    
    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 *audio_tid; 
    SDL_Thread *video_tid; 
    
    AVIOContext *io_ctx; 
    struct SwsContext *sws_ctx; 
    
    int quit; 
} VideoState; 
    
VideoState *global_video_state;
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式