资源简介
ffmpeg/ffplay是当今多媒体领域的王者,很多很多的人想研究学习ffmpeg/ffplay,但苦于ffmpeg/ffplay庞大的代码量,令人望而生畏。为帮助更多的人研习ffmpeg/ffplay,在保持ffmpeg/ffplay体系架构的完整性的前提下,把ffmpeg/ffplay大规模的瘦身后,研习门槛一下子降低了n多个数量级。附件一个是对瘦身后的ffmpeg/ffplay的代码完整的剖析pdf文档,另一个是瘦身后的ffmpeg/ffplay的完整源代码,最大化帮助各位网友研究学习ffmpeg/ffplay。
代码片段和文件信息
#include “./libavformat/avformat.h“
#if defined(CONFIG_WIN32)
#include
#include
#include
#else
#include
#include
#endif
#include
#include
#include
#include
#ifdef CONFIG_WIN32
#undef main // We don‘t want SDL to override our main()
#endif
#pragma comment(lib “SDL.lib“)
#define FF_QUIT_EVENT (SDL_USEREVENT + 2)
#define MAX_VIDEOQ_SIZE (5 * 256 * 1024)
#define MAX_AUDIOQ_SIZE (5 * 16 * 1024)
#define VIDEO_PICTURE_QUEUE_SIZE 1
typedef struct PacketQueue
{
AVPacketList *first_pkt *last_pkt;
int size;
int abort_request;
SDL_mutex *mutex;
SDL_cond *cond;
} PacketQueue;
typedef struct VideoPicture
{
SDL_Overlay *bmp;
int width height; // source height & width
} VideoPicture;
typedef struct VideoState
{
SDL_Thread *parse_tid;
SDL_Thread *video_tid;
int abort_request;
AVFormatContext *ic;
int audio_stream;
int video_stream;
AVStream *audio_st;
AVStream *video_st;
PacketQueue audioq;
PacketQueue videoq;
VideoPicture pictq[VIDEO_PICTURE_QUEUE_SIZE];
double frame_last_delay;
uint8_t audio_buf[(AVCODEC_MAX_AUDIO_frame_SIZE *3) / 2];
unsigned int audio_buf_size;
int audio_buf_index;
AVPacket audio_pkt;
uint8_t *audio_pkt_data;
int audio_pkt_size;
SDL_mutex *video_decoder_mutex;
SDL_mutex *audio_decoder_mutex;
char filename[240];
} VideoState;
static AVInputFormat *file_iformat;
static const char *input_filename;
static VideoState *cur_stream;
static SDL_Surface *screen;
int64_t av_gettime(void)
{
#if defined(CONFIG_WINCE)
return timeGetTime() *int64_t_C(1000);
#elif defined(CONFIG_WIN32)
struct _timeb tb;
_ftime(&tb);
return ((int64_t)tb.time *int64_t_C(1000) + (int64_t)tb.millitm) *int64_t_C(1000);
#else
struct timeval tv;
gettimeofday(&tv NULL);
return (int64_t)tv.tv_sec *1000000+tv.tv_usec;
#endif
}
static void packet_queue_init(PacketQueue *q) // packet queue handling
{
memset(q 0 sizeof(PacketQueue));
q->mutex = SDL_CreateMutex();
q->cond = SDL_CreateCond();
}
static void packet_queue_flush(PacketQueue *q)
{
AVPacketList *pkt *pkt1;
SDL_LockMutex(q->mutex);
for (pkt = q->first_pkt; pkt != NULL; pkt = pkt1)
{
pkt1 = pkt->next;
av_free_packet(&pkt->pkt);
av_freep(&pkt);
}
q->last_pkt = NULL;
q->first_pkt = NULL;
q->size = 0;
SDL_UnlockMutex(q->mutex);
}
static void packet_queue_end(PacketQueue *q)
{
packet_queue_flush(q);
SDL_DestroyMutex(q->mutex);
SDL_DestroyCond(q->cond);
}
static int packet_queue_put(PacketQueue *q AVPacket *pkt)
{
AVPacketList *pkt1;
pkt1 = av_malloc(sizeof(AVPacketList));
if (!pkt1)
return - 1;
pkt1->pkt =
相关资源
- 从ffmpeg中抽取的h264解码器,可用于
- 最简单的基于FFmpeg的推流器以推送R
- DVD文件VOB的生成代码
- FFmpeg 采集摄像头输出rtmp直播流媒体,
- 基于ffmpeg将avi视频转换为mp4视频
- (补充)修改output-example,将H.264AAC帧
- ffmpeg-win64位库
- X264实时编码,FFmpeg实时解码
- FFmpeg API读取视音频文件信息的一个工
- 使用FFmpeg采集摄像头图像和麦克风音
- ffplay_win32
- opencv_ffmpeg249.dll
- FFmpeg-3.1 windows vs2013编译动态库静态库
- 基于FFmpeg4.0.2的AAC编码器
- FFmpeg获取网络摄像头数据解码
- Qt写的Windows下屏幕录制程序源码
- Windows下使用FFMPEG解码AAC文件并使用
- ffmpeg转换MP4为JPG帧图片
- ffmpeg解码sdl播放h264
- 最简单的利用ffmpeg获取视频的图片
- 最简单的基于FFmpeg的编码器 1.2
- vs2012调试ffmpeg.c
- 基于FFMPEG SDK流媒体开发1---解码媒体文
- ffmpeg 源码demo
- 最简单的基于FFMPEG的AVDevice的 1.2
- 最简单的基于FFMPEG的音频编码器 1.1
- 最简单的基于FFMPEG+SDL的视频播放器
- ffmpeg提取mp4关键帧保存为jpg.zip
- ffmpeg+qt的简单播放器
- 使用ffmpeg将多张图片生成H264裸流并获
评论
共有 条评论