int per_sample= av_get_bytes_per_sample(pframe->format); for (int i = 0; i < pframe->nb_samples; i++) { for (int j = 0; j < pframe->channels; j++) { fwrite(pframe->data[j] + per_sample * i, 1, data_size, pFile); } }
时间: 2024-03-29 08:34:25 浏览: 126
这段代码的作用是将音频帧保存为一个裸的PCM文件。其中,pframe代表要保存的音频帧,pFile代表要保存的文件句柄。这段代码通过嵌套的循环,逐个采样点地将音频数据写入文件中。
per_sample变量表示每个采样点占用的字节数,可以通过av_get_bytes_per_sample函数获取。在写入文件时,需要根据采样点占用的字节数和采样点的索引计算出采样点的数据地址,然后将数据写入文件中。因为音频帧中的采样点是交叉排列的,所以需要内层循环遍历每个声道的数据,外层循环遍历每个采样点。
需要注意的是,代码中的data_size变量未定义,应该将其改为per_sample。另外,保存的PCM数据需要手动添加文件头信息才能被常见的播放器识别,推荐使用FFmpeg提供的命令行工具进行封装。
相关问题
too many arguments to function ‘av_frame_get_best_effort_timestamp’ 86 | int samples_per_frame = av_frame_get_best_effort_timestamp(pframe, 0);
这个错误提示意味着您在调用函数 av_frame_get_best_effort_timestamp 时传递了太多的参数。根据ffmpeg的API文档,该函数只有一个参数,即AVFrame类型的指针。请检查您的代码,确保您只向该函数传递了一个参数。如果您仍然遇到问题,请提供更多上下文或完整代码以便更好地帮助您解决问题。
int CCjModbusTcp::makeSendFrame( const CFrameModbusPdu* pdu,CFrameModbus* frame ) { CFrameModbusTcp* pFrame = (CFrameModbusTcp*)frame; // 处理报文头 //ztn 20161019 mod if(m_falg_mbap_transId == MBAP_TRANSID_DEFAULT) { if( pFrame->getTransId()==0xFF ) pFrame->getTransId() = 0; else pFrame->getTransId() = pFrame->getTransId()+1; } else pFrame->getTransId() = m_falg_mbap_transId; if( m_falg_mbap_protocolId == MBAP_PROTOCOLID_DEFAULT) pFrame->getProtocolId() = 0; else pFrame->getProtocolId() = m_falg_mbap_protocolId; pFrame->getUnitId() = address(); pFrame->pdu() = *pdu; return 0; } extern "C" CProtocolBase* CreateProtocolOf124() { cout <<"create protocol of 124 cj modbus tcp"<<endl; return new CCjModbusTcp; }
这段代码是一个名为 CCjModbusTcp 的类中的 makeSendFrame 函数和一个名为 CreateProtocolOf124 的函数。makeSendFrame 函数接受两个参数:一个 CFrameModbusPdu 类型的指针 pdu,和一个 CFrameModbus 类型的指针 frame。函数的作用是构造一个 Modbus TCP 帧的发送帧。首先将 frame 转换成 CFrameModbusTcp 类型的指针 pFrame。然后根据 m_falg_mbap_transId 和 m_falg_mbap_protocolId 的值,处理报文头的传输标识和协议标识。如果 m_falg_mbap_transId 的值为 MBAP_TRANSID_DEFAULT,则将 pFrame 的传输标识设置为 0 或者加 1;否则将 pFrame 的传输标识设置为 m_falg_mbap_transId 的值。如果 m_falg_mbap_protocolId 的值为 MBAP_PROTOCOLID_DEFAULT,则将 pFrame 的协议标识设置为 0;否则将 pFrame 的协议标识设置为 m_falg_mbap_protocolId 的值。最后将 pFrame 的单元标识设置为 address(),并将 pdu 的值赋给 pFrame 的 PDU。函数返回 0。
CreateProtocolOf124 函数是一个 CProtocolBase 的工厂函数,用于创建一个 CCjModbusTcp 对象。函数返回一个 CProtocolBase 类型的指针,指向新创建的 CCjModbusTcp 对象。
阅读全文