# dn **Repository Path**: xihe/dn ## Basic Information - **Project Name**: dn - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2019-02-18 - **Last Updated**: 2020-12-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 解码流程 ![输入图片说明](https://images.gitee.com/uploads/images/2019/0302/153228_8ea8c193_560775.png "屏幕截图.png") ![输入图片说明](https://images.gitee.com/uploads/images/2019/0302/153255_0188a64b_560775.png "屏幕截图.png") ```cpp step1: 注册解码器并初始化网络 av_register_all(); avformat_network_init(); step2: 打开文件或网络流 AVFormatContext* fmt_ctx = avformat_alloc_context(); avformat_open_input(&fmt_ctx, url, NULL, NULL); step3:获取流信息 avformat_find_stream_info(&fmt_ctx, NULL); step4:获取音频 pFormatCtx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO step5:获取解码器 AVCodec *dec = avcodec_find_decoder(audio->codecpar->codec_id); step6:利用解码器创建解码器上下文 AVCodecContext *avCodecContext = avcodec_alloc_context3(dec); avcodec_parameters_to_context(audio->avCodecContext, audio->codecpar) step7:打开解码器 avcodec_open2(audio->avCodecContext, dec, 0) step8: 读取音频帧 AVPacket *packet = av_packet_alloc(); av_read_frame(pFormatCtx, packet); ``` # 生产者消费者模型: 生产packet,播放frame ```cpp //创建线程:arg1:线程id arg2:属性 //arg3:线程执行的任务 arg4:传递给线程的参数 int pthread_create(pthread_t* __pthread_ptr, pthread_attr_t const* __attr, void* (*__start_routine)(void*), void*); // 退出线程 void pthread_exit(void* __return_value) __noreturn; pthread_mutex_t :用于创建线程锁对象如:pthread_mutex_t mutex;  pthread_mutex_init :用于初始化pthread_mutex_t锁对象如:pthread_mutex_init(&mutex, NULL);  pthread_mutex_destroy :用于销毁pthread_mutex_t锁对象如:pthread_mutex_destroy(&mutex);  pthread_cond_t :用于创建线程条件对象如:pthread_cond_t cond;  pthread_cond_init :用于初始化pthread_cond_t条件对象如:pthread_cond_init(&cond, NULL);  pthread_cond_destroy :用于销毁pthread_cond_t条件对象如:pthread_cond_destroy(&cond);  pthread_mutex_lock :用于上锁mutex,本线程上锁后的其他变量是不能 被别的线程操作的如:pthread_mutex_lock(&mutex);  pthread_mutex_unlock :用于解锁mutex,解锁后的其他变量可以被其他线程操作如:pthread_mutex_unlock(&mutex);  pthread_cond_signal :用于发出条件信号如:pthread_cond_signal(&mutex, &cond);  pthread_cond_wait :用于线程阻塞等待,直到pthread_cond_signal发出条件信号后 才执行退出线程阻塞执行后面的操作。  ```