Menu Home

FFMPEG + SDL音频播放分析

抽象流程: 设置SDL的音频参数 —-> 打开声音设备,播放静音 —-> ffmpeg读取音频流中数据放入队列 —-> SDL调用用户设置的函数来获取音频数据 —-> 播放音频 SDL内部维护了一个buffer来存放解码后的数据,这个buffer中的数据来源是我们注册的回调函数(audio_callback),audio_callback调用audio_decode_frame来做具体的音频解码工作,需要引起注意的是:从流中读取出的一个音频包(avpacket)可能含有多个音频桢(avframe),所以需要多次调用avcodec_decode_audio4来完成整个包的解码,解码出来的数据存放在我们自己的缓冲中(audio_buf2)。SDL每一次回调都会引起数据从audio_buf2拷贝到SDL内部缓冲区,当audio_buf2中的数据大于SDL的缓冲区大小时,需要分多次拷贝。 关键实现: main()函数 int main(int argc, char **argv){ SDL_Event event; //SDL事件变量 VideoState *is; // 纪录视频及解码器等信息的大结构体 is = (VideoState*) av_mallocz(sizeof(VideoState)); if(argc < 2){ fprintf(stderr, “Usage: play <file>\n”); exit(1); } av_register_all(); //注册所有ffmpeg的解码器 /* 初始化SDL,这里只实用了AUDIO,如果有视频,好需要SDL_INIT_VIDEO等等 */ if(SDL_Init(SDL_INIT_AUDIO)){ fprintf(stderr, “Count not initialize SDL – […]

jpeg转换OpenGL Texture

jpeg转换OpenGL Texture #include <stdio.h> #include <unistd.h> #include <jpeglib.h> #include <stdlib.h> #include <GL/gl.h> #include <GL/glut.h> void LoadJpgTextureGL(char *file) { FILE *jpegFile; int sizebuf; unsigned char* buffer; unsigned char* texturebuf; struct jpeg_decompress_struct cinfo; struct jpeg_error_mgr jerr; cinfo.err = jpeg_std_error(&jerr); jpeg_create_decompress(&cinfo); if((jpegfile = fopen(file,”rb”))==NULL) { perror(“fopen jpeg”); return; } jpeg_stdio_src(&cinfo,jpefile); jpeg_read_header(&cinfo,TRUE); jpeg_start_decompress(&cinfo); sizebuf […]

png转换OpenGL Texture

bool loadPngImage(char *name, int *outWidth, int *outHeight, bool *outHasAlpha, GLubyte **outData) { png_structp png_ptr; png_infop info_ptr; unsigned int sig_read = false; int color_type, interlace_type; FILE *fp; printf(“png file : %s\n”, name); if((fp = fopen(name, “rb”)) == NULL) { printf(“%s: open png file error: \n”, __FILE__); perror(“open filed:\n”); return false; } […]

LINUX网卡(设置千兆网卡速度及模式)

Ethtool命令: 摘要 ethtool ethX #查询ethX网口基本设置 ethtool –h #显示ethtool的命令帮助(help) ethtool –i ethX #查询ethX网口的相关信息 ethtool –d ethX #查询ethX网口注册性信息 ethtool –r ethX #重置ethX网口到自适应模式 ethtool –S ethX #查询ethX网口收发包统计 ethtool –s ethX [speed 10|100|1000] #设置网口速率10/100/1000M [duplex half|full] #设置网口半/全双工 [autoneg on|off] #设置网口是否自协商 [port tp|aui|bnc|mii] #设置网口类型 [phyad N] [xcvr internal|exteral] [wol p|u|m|b|a|g|s|d…] [sopass xx:yy:zz:aa:bb:cc] [msglvl N] 举例 […]

埃拉托斯特尼筛选法

埃拉托斯特尼筛选法又称筛法,是求不超过自然数N(N>1)的所有质数的一种方法。据说是古希腊的埃拉托斯特尼(Eratosthenes,约公元前274~194年)发明的,又称埃拉托斯特尼筛子。 具体做法是: 先把N个自然数按次序排列起来。1不是质数,也不是合数,要划去。第二个数2是质数留下来,而把2后面所有能被2整除的数都划去。2后面第一个没划去的数是3,把3留下,再把3后面所有能被3整除的数都划去。3后面第一个没划去的数是5,把5留下,再把5后面所有能被5整除的数都划去。这样一直做下去,就会把不超过N的全部合数都筛掉,留下的就是不超过N的全部质数。因为希腊人是把数写在涂腊的板上,每要划去一个数,就在上面记以小点,寻求质数的工作完毕后,这许多小点就像一个筛子,所以就把埃拉托斯特尼的方法叫做“埃拉托斯特尼筛”,简称“筛法”。(另一种解释是当时的数写在纸草上,每要划去一个数,就把这个数挖去,寻求质数的工作完毕后,这许多小洞就像一个筛子。) using std::size_t; using std::sqrt; using std::string; class SieveTest : public TestSuit::Test { string sieveChars; public: SieveTest() : sieveChars(50, ‘P’) {} void run() { findPrimes(); testPrimes(); } bool isPrime(int p) { if(p == 0 || p == 1) return false; int root = int(sqrt(double(p))); for(int i = 2; […]

xlib创建一个openGL简单窗口

void CreateWindow(int width, int height) { XInitThreads(); m_scrWidth = width; m_scrHeight = height; int attr[] = { GLX_RENDER_TYPE, GLX_RGBA_BIT, GLX_DOUBLEBUFFER, True, GLX_DEPTH_SIZE, 16, None, }; m_dpy = XOpenDisplay(NULL); if (m_dpy == NULL) { cerr << “XOpenDisplay error” << endl; return; } int nelements; GLXFBConfig *fc = glXChooseFBConfig(m_dpy, 0, attr, &nelements); […]

linux下使用C语言生成bitmap

#ifndef SAVEBMP_H #define SAVEBMP_H #include <stdio.h> #include <stdlib.h> typedef long LONG; typedef unsigned char BYTE; typedef unsigned int DWORD; typedef unsigned short WORD; typedef struct { WORD bfType; DWORD bfSize; WORD bfReserved1; WORD bfReserved2; DWORD bfOffBits; } BMPFILEHEADER_T; typedef struct { DWORD biSize; DWORD biWidth; DWORD biHeight; WORD biPlanes; WORD […]