如何在Android用FFmpeg+SDL2.0解码图像线程

子衿沉夜
浏览 595回答 1
1回答

冉冉说

&nbsp;创建一个VideoPicture结构体用来保存解码出来12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091/*&nbsp;*&nbsp;SDL_Lesson.c&nbsp;*&nbsp;*&nbsp;&nbsp;Created&nbsp;on:&nbsp;Aug&nbsp;12,&nbsp;2014&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Author:&nbsp;clarck&nbsp;*/#include&nbsp;<jni.h>#include&nbsp;<android/native_window_jni.h>#include&nbsp;"SDL.h"#include&nbsp;"SDL_thread.h"#include&nbsp;"SDL_events.h"#include&nbsp;"../include/logger.h"#include&nbsp;"../ffmpeg/includebavcodec/avcodec.h"#include&nbsp;"../ffmpeg/includebavformat/avformat.h"#include&nbsp;"../ffmpeg/includebavutil/pixfmt.h"#include&nbsp;"../ffmpeg/includebswscale/swscale.h"#include&nbsp;"../ffmpeg/includebswresample/swresample.h"&nbsp;&nbsp;#define&nbsp;SDL_AUDIO_BUFFER_SIZE&nbsp;1024&nbsp;&nbsp;#define&nbsp;MAX_AUDIO_SIZE&nbsp;(5&nbsp;*&nbsp;16&nbsp;*&nbsp;1024)#define&nbsp;MAX_VIDEO_SIZE&nbsp;(5&nbsp;*&nbsp;256&nbsp;*&nbsp;1024)&nbsp;&nbsp;#define&nbsp;FF_ALLOC_EVENT&nbsp;(SDL_USEREVENT)#define&nbsp;FF_REFRESH_EVENT&nbsp;(SDL_USEREVENT&nbsp;+&nbsp;1)#define&nbsp;FF_QUIT_EVENT&nbsp;&nbsp;&nbsp;&nbsp;(SDL_USEREVENT&nbsp;+&nbsp;2)&nbsp;&nbsp;#define&nbsp;VIDEO_PICTURE_QUEUE_SIZE&nbsp;1#define&nbsp;AVCODEC_MAX_AUDIO_FRAME_SIZE&nbsp;192000&nbsp;//&nbsp;1&nbsp;second&nbsp;of&nbsp;48khz&nbsp;32bit&nbsp;audio&nbsp;&nbsp;typedef&nbsp;struct&nbsp;PacketQueue&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;AVPacketList&nbsp;*first_pkt,&nbsp;*last_pkt;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;nb_packets;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;size;&nbsp;&nbsp;&nbsp;&nbsp;SDL_mutex&nbsp;*mutex;&nbsp;&nbsp;&nbsp;&nbsp;SDL_cond&nbsp;*cond;}&nbsp;PacketQueue;&nbsp;&nbsp;typedef&nbsp;struct&nbsp;VideoPicture&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;SDL_Window&nbsp;*screen;&nbsp;&nbsp;&nbsp;&nbsp;SDL_Renderer&nbsp;*renderer;&nbsp;&nbsp;&nbsp;&nbsp;SDL_Texture&nbsp;*bmp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AVFrame*&nbsp;rawdata;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;width,&nbsp;height;&nbsp;/*source&nbsp;height&nbsp;&&nbsp;width*/&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;allocated;}&nbsp;VideoPicture;&nbsp;&nbsp;typedef&nbsp;struct&nbsp;VideoState&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;filename[1024];&nbsp;&nbsp;&nbsp;&nbsp;AVFormatContext&nbsp;*ic;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;videoStream,&nbsp;audioStream;&nbsp;&nbsp;&nbsp;&nbsp;AVStream&nbsp;*audio_st;&nbsp;&nbsp;&nbsp;&nbsp;AVFrame&nbsp;*audio_frame;&nbsp;&nbsp;&nbsp;&nbsp;PacketQueue&nbsp;audioq;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;audio_buf_size;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;audio_buf_index;&nbsp;&nbsp;&nbsp;&nbsp;AVPacket&nbsp;audio_pkt;&nbsp;&nbsp;&nbsp;&nbsp;uint8_t&nbsp;*audio_pkt_data;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;audio_pkt_size;&nbsp;&nbsp;&nbsp;&nbsp;uint8_t&nbsp;*audio_buf;&nbsp;&nbsp;&nbsp;&nbsp;DECLARE_ALIGNED(16,uint8_t,audio_buf2)&nbsp;[AVCODEC_MAX_AUDIO_FRAME_SIZE&nbsp;*&nbsp;4];&nbsp;&nbsp;&nbsp;&nbsp;enum&nbsp;AVSampleFormat&nbsp;audio_src_fmt;&nbsp;&nbsp;&nbsp;&nbsp;enum&nbsp;AVSampleFormat&nbsp;audio_tgt_fmt;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;audio_src_channels;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;audio_tgt_channels;&nbsp;&nbsp;&nbsp;&nbsp;int64_t&nbsp;audio_src_channel_layout;&nbsp;&nbsp;&nbsp;&nbsp;int64_t&nbsp;audio_tgt_channel_layout;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;audio_src_freq;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;audio_tgt_freq;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;SwrContext&nbsp;*swr_ctx;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AVStream&nbsp;*video_st;&nbsp;&nbsp;&nbsp;&nbsp;PacketQueue&nbsp;videoq;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VideoPicture&nbsp;pictq[VIDEO_PICTURE_QUEUE_SIZE];&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;pictq_size,&nbsp;pictq_rindex,&nbsp;pictq_windex;&nbsp;&nbsp;&nbsp;&nbsp;SDL_mutex&nbsp;*pictq_mutex;&nbsp;&nbsp;&nbsp;&nbsp;SDL_cond&nbsp;*pictq_cond;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SDL_Thread&nbsp;*parse_tid;&nbsp;&nbsp;&nbsp;&nbsp;SDL_Thread&nbsp;*audio_tid;&nbsp;&nbsp;&nbsp;&nbsp;SDL_Thread&nbsp;*video_tid;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AVIOContext&nbsp;*io_ctx;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;SwsContext&nbsp;*sws_ctx;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;quit;}&nbsp;VideoState;&nbsp;&nbsp;VideoState&nbsp;*global_video_state;&nbsp;
打开App,查看更多内容
随时随地看视频慕课网APP