作者 ookk303

1、更新了红外相机kt库

2、更新了m30滤波
3、增加文件信息帧
4、修改了部分型号的音量
5、增加了外置的超时输入
6、增加了文件校验功能
7、优化了喊话器温控后音量跳转的问题
正在显示 47 个修改的文件 包含 2484 行增加791 行删除

要显示太多修改。

为保证性能只显示 47 of 47+ 个文件。

... ... @@ -17,7 +17,30 @@
"jzsdk_uart_input.h": "c",
"jzsdk_inscode.h": "c",
"psdk_ui_io.h": "c",
"lighting_inandout.h": "c"
"lighting_inandout.h": "c",
"pseudocolor.h": "c",
"sidelaser.h": "c",
"ktv330_cpp.h": "c",
"kt_irc_deal.h": "c",
"badpixelproc.h": "c",
"irc_funtion.h": "c",
"jzsdk_usb_bulk.h": "c",
"ircut.h": "c",
"irc_param.h": "c",
"ktlibproc.h": "c",
"mediaproc_param.h": "c",
"irc_data_deal.h": "c",
"jzsdk_returncode.h": "c",
"jzsdk_filetype.h": "c",
"jzsdk_widgetcode.h": "c",
"jzsdk_fs_standards.h": "c",
"audiofile_param.h": "c",
"checksum_src.h": "c",
"jzsdk_logger.h": "c",
"paramterparsing.h": "c",
"megtempcontrol.h": "c",
"jzsdk_uart_send.h": "c",
"espeak_tts.h": "c"
},
"Codegeex.GenerationPreference": "automatic"
}
\ No newline at end of file
... ...
# 编译链的配置
#1、编译链与设备类型的选择
set(DEVICE_NAME JZ_H1T)
set(DEVICE_NAME JZ_U3S)
#上一行为禁止修改行
if("${DEVICE_NAME}" STREQUAL "JZ_H1E")
... ... @@ -28,6 +28,9 @@ elseif("${DEVICE_NAME}" STREQUAL "JZ_U3")
elseif("${DEVICE_NAME}" STREQUAL "JZ_U3S")
set(MAKE_COMPILER ARM_CORTEXA9_LINUX)
set(DEVICE_TYPE MEGAPHONE)
elseif("${DEVICE_NAME}" STREQUAL "JZ_U3D")
set(MAKE_COMPILER ARM_CORTEXA9_LINUX)
set(DEVICE_TYPE MEGAPHONE)
elseif("${DEVICE_NAME}" STREQUAL "TF_A1")
set(MAKE_COMPILER ARM_CORTEXA9_LINUX)
set(DEVICE_TYPE MEGAPHONE)
... ...
... ... @@ -53,6 +53,26 @@ set(UI_CONTROL_MODULE VERSION_SWITCH_ON)
#####################################################################
if("${DEVICE_NAME}" STREQUAL "JZ_H1E")
# 添加AudioDeal 音频处理模块
set(AUDIODEAL_MODULE VERSION_SWITCH_ON)
# 添加Gimbal 云台处理模块
set(GIMBAL_MODULE VERSION_SWITCH_ON)
# 添加IRCUT 引脚处理模块
set(IRCUT_MODULE VERSION_SWITCH_ON)
# 添加LIGHTING 光源处理模块
set(LIGHTING_MODULE VERSION_SWITCH_ON)
# 添加喊话器模块
set(MEGAPHONE_MODULE VERSION_SWITCH_ON)
# 添加电源管理模块
set(POWER_MANAGER_MODULE VERSION_SWITCH_ON)
# 添加FFMPEG及其附属模块
set(FFMPEG_MODULE VERSION_SWITCH_ON)
elseif("${DEVICE_NAME}" STREQUAL "JZ_H1T")
... ... @@ -103,6 +123,29 @@ elseif("${DEVICE_NAME}" STREQUAL "JZ_U3S")
# 添加激光模块
set(SIDE_LASER_MODULE VERSION_SWITCH_ON)
elseif("${DEVICE_NAME}" STREQUAL "JZ_U3D")
# 添加AudioDeal 音频处理模块
set(AUDIODEAL_MODULE VERSION_SWITCH_ON)
# 添加Gimbal 云台处理模块
set(GIMBAL_MODULE VERSION_SWITCH_ON)
# 添加IRCUT 引脚处理模块
set(IRCUT_MODULE VERSION_SWITCH_ON)
# 添加LIGHTING 光源处理模块
set(LIGHTING_MODULE VERSION_SWITCH_ON)
# 添加喊话器模块
set(MEGAPHONE_MODULE VERSION_SWITCH_ON)
# 添加电源管理模块
set(POWER_MANAGER_MODULE VERSION_SWITCH_ON)
# 添加FFMPEG及其附属模块
set(FFMPEG_MODULE VERSION_SWITCH_ON)
elseif("${DEVICE_NAME}" STREQUAL "JZ_C1")
# 添加Gimbal 云台处理模块
... ... @@ -122,6 +165,9 @@ elseif("${DEVICE_NAME}" STREQUAL "JZ_C1")
# 添加红外相机模块
set(IRC_MODULE VERSION_SWITCH_ON)
# 添加昆腾模块
set(LIB_KT_MODULE VERSION_SWITCH_ON)
endif()
message("模组模块已加载\n")
\ No newline at end of file
... ...
... ... @@ -160,4 +160,15 @@ if(${LIB_USB} STREQUAL "VERSION_SWITCH_ON")
${PROJECT_NAME}
${ROOT_DIRS}/ThirdParty/udev/aarch64-none-linux-gnu/lib/libudev.so.1.6.3
)
endif()
\ No newline at end of file
endif()
#kt_IRC库
if(${LIB_KT_IRC} STREQUAL "VERSION_SWITCH_ON")
message("ktIRC库已加载\n")
include_directories(${ROOT_DIRS}/ThirdParty/KT_IRC/include)
target_link_libraries(
${PROJECT_NAME}
${ROOT_DIRS}/ThirdParty/KT_IRC/aarch64-none-linux-gnu/lib/libktlib.so
)
endif()
... ...
... ... @@ -6,6 +6,7 @@ set(ALSALIB_MODULE VERSION_SWITCH_OFF)
set(OPUS_MODULE VERSION_SWITCH_OFF)
set(LIB_RTK_MMP VERSION_SWITCH_OFF)
set(LIB_USB VERSION_SWITCH_OFF)
set(LIB_KT_IRC VERSION_SWITCH_OFF)
add_definitions(-D COMPILE_MODE_MODULE) #设置代码为编译模式
... ... @@ -38,9 +39,13 @@ if(${IRC_MODULE} STREQUAL "VERSION_SWITCH_ON")
message("\n媒体管理模块已加载")
add_definitions(-DMACRO_MEDIA_PROC_MODULE)
if(${IRC_MODULE} STREQUAL "VERSION_SWITCH_ON")
set(LIB_KT_IRC VERSION_SWITCH_ON)
endif()
endif()
if(${SIDE_LASER_MODULE} STREQUAL "VERSION_SWITCH_ON")
message("加载侧面激光模块")
add_definitions(-DMACRO_SIDE_LASER_MODULE)
... ...
... ... @@ -23,6 +23,7 @@ extern "C" {
#include "JZsdk_Delay/JZsdk_Delay.h"
#include "JZsdk_Code/JZsdk_FLagCode.h"
#include "JZsdk_Osal/JZsdk_MemoryAdapter.h"
#include "JZsdk_Osal/JZsdk_CheckSum/JZsdk_CheckSum.h"
/* Exported types ------------------------------------------------------------*/
... ...
... ... @@ -23,6 +23,7 @@ extern "C" {
#include "./JZsdk_FLagCode.h"
#include "./JZsdk_ReturnCode.h"
#include "./JZsdk_FileType.h"
#include "./JZsdk_WidgetCode.h"
/* Exported types ------------------------------------------------------------*/
... ...
... ... @@ -55,6 +55,14 @@ typedef enum {
JZ_ERRORCODE_GIMBAL_INVALID_ROLL = 0x4002,
} JZ_Gimbal_ErrorCode;
typedef enum {
JZ_ERROR_CHECKCODE_CHECK_ERROR = 0x5000, //校验码错误
JZ_ERROR_CHECKCODE_DECODE_ERROR = 0x5001, //解码错误
} JZ_CheckCode; //检查校验码
/* Exported functions --------------------------------------------------------*/
#ifdef __cplusplus
... ...
... ... @@ -38,11 +38,13 @@ typedef enum {
JZ_INSCODE_5AFRAME_REALTIMEMP2_UNLIMIT_TRANSMISSION = 0x10000201, //无限制传输实时MP2
JZ_INSCODE_5AFRAME_REALTIMEMP2_STOP = 0x10000202, //结束实时MP2
JZ_INSCODE_5AFRAME_REALTIMEMP2_LIMIT_TRANSMISSION = 0x10000203, //有限制传输MP2
JZ_INSCODE_5AFRAME_AUDIOFILE_TRANS_START = 0x10000300, //打开音频文件上传
JZ_INSCODE_5AFRAME_AUDIOFILE_TRANS_UNLIMIT_TRANSMISSION = 0x10000301, //无限制传输音频文件
JZ_INSCODE_5AFRAME_AUDIOFILE_TRANS_STOP = 0x10000302, //关闭音频文件上传
JZ_INSCODE_5AFRAME_AUDIOFILE_TRANS_LIMIT_TRANSMISSION = 0x10000303, //定长传输音频文件
JZ_INSCODE_5AFRAME_AUDIOFILE_TRANS_STOP_AND_CHECK = 0x10000304, //关闭音频文件上传并校验
JZ_INSCODE_5AFRAME_AUDIO_PLAYFILE = 0x10000400, //播放指定音频
JZ_INSCODE_5AFRAME_AUDIO_CONTINUE = 0x10000401, //音频继续播放
... ... @@ -69,6 +71,8 @@ typedef enum {
JZ_INSCODE_5AFRAME_CHECKSTATUS_PLAYFILENAME = 0x10000624, //查询播放文件名
JZ_INSCODE_5AFRAME_CHECKSTATUS_SOFTWAREVERSION = 0x10000625, //查询软件版本号
JZ_INSCODE_5AFRAME_CHECKSTATUS_LOOPPLAY = 0x10000626, //查询是否打开循环
JZ_INSCODE_5AFRAME_CHECKSTATUS_ADUIO_LOOP_INTERVAL = 0x10000639, //查询音频循环间隔
JZ_INSCODE_5AFRAME_CHECKSTATUS_TTSTONE = 0x10000627, //查询音色
JZ_INSCODE_5AFRAME_CHECKSTATUS_TTSSPEED = 0x10000628, //查询语速
JZ_INSCODE_5AFRAME_CHECKSTATUS_SEARCHLIGHT_LIGHTATTRIBUTE = 0x10000629, //查询探照灯 灯3个属性
... ... @@ -81,9 +85,11 @@ typedef enum {
JZ_INSCODE_5AFRAME_CHECKSTATUS_WARNINGLIGHT_STATUS = 0x10000635, //查询警灯状态
JZ_INSCODE_5AFRAME_CHECKSTATUS_WARNINGLIGHT_COLOR = 0x10000636, //查询警灯颜色
JZ_INSCODE_5AFRAME_CHECKSTATUS_SERIALNUMBER = 0x10000637, //查询序列号
JZ_INSCODE_5AFRAME_CHECKSTATUS_AUDIO_DETAIL_MESSAGE = 0x10000638, //查询音频详细信息
JZ_INSCODE_5AFRAME_PLAY_LOOP = 0x10000690, //开启关闭循环
JZ_INSCODE_5AFRAME_ADUIO_PLAY_LOOP_INTERVAL = 0x10000691, //设置音频循环间隔
JZ_INSCODE_5AFRAME_DELETE_AUDIO = 0x10000700, //删除音频
JZ_INSCODE_5AFRAME_DELETE_VOICE_RECORD = 0x10000710, //删除录音
... ... @@ -102,6 +108,7 @@ typedef enum {
JZ_INSCODE_5AFRAME_OPUS_TRANS_LIMIT_TRANSMISSION = 0x10000903, //opus传输中
JZ_INSCODE_5AFRAME_OPUS_TRANS_STOP = 0x10000902, //opus传输结束
JZ_INSCODE_5AFRAME_OPUS_TRANS_STOP_AND_CHECK = 0x10000904, //opus传输结束并校验
JZ_INSCODE_5AFRAME_OPUS_PLAY = 0x10000910, //opus播放
... ... @@ -142,7 +149,9 @@ typedef enum {
JZ_INSCODE_5BFRAME_DEVICE_MESSAGE = 0x10004107, //设备信息
JZ_INSCODE_5BFRAME_SUCESS = 0x10004200, //操作成功
JZ_INSCODE_5BFRAME_DEFEAT = 0x10004201, //操作失败
JZ_INSCODE_5BFRAME_FILE_CHECK_DEFEAT = 0x10004201, //校验失败
JZ_INSCODE_5BFRAME_FILE_DECODE_DEFEAT = 0x10004202, //解码失败
JZ_INSCODE_5BFRAME_DEFEAT = 0x100042FF, //操作失败
JZ_INSCODE_5BFRAME_MUSICLIST_START = 0x10004300, //开启发送音乐列表帧
JZ_INSCODE_5BFRAME_MUSICLIST_TRANS = 0x10004301, //发送音乐列表帧
... ... @@ -156,6 +165,7 @@ typedef enum {
JZ_INSCODE_5BFRAME_TTS_TONE = 0x10004402, //发送tts音色
JZ_INSCODE_5BFRAME_TTS_SPEED = 0x10004403, //发送tts语速
JZ_INSCODE_5BFRAME_AUDIO_PLAYFILENAME = 0x10004404, //当前播放的音频名字
JZ_INSCODE_5BFRAME_CHECKSTATUS_AUDIO_DETAIL_MESSAGE = 0x10004405, //查询音频详细信息
JZ_INSCODE_5BFRAME_GIMBAL_PITCH = 0x10004500, //云台俯仰角度
... ... @@ -182,6 +192,7 @@ typedef enum {
JZ_INSCODE_5BFRAME_CHECKSTATUS_OUTPUTPOWER = 0x10004900, //对外供电查询
JZ_INSCODE_5BFRAME_OPUS_DECODE_STATUS = 0x10005000, //opus解码状态
JZ_INSCODE_5BFRAME_OPUS_TRANS_STOP_AND_CHECK = 0x10000904, //opus传输结束并校验
//6A类
... ...
/**
********************************************************************
* @file JZsdk_WidgetCode.h
* 用于控件线程的的表
*
*********************************************************************
*/
/* Define to prevent recursive inclusion 避免重定义 -------------------------------------*/
#ifndef JZSDK_WIDGET_CODE_H
#define JZSDK_WIDGET_CODE_H
/* Includes ------------------------------------------------------------------*/
#ifdef __cplusplus
extern "C" {
#endif
/* Exported constants --------------------------------------------------------*/
/* 常亮定义*/
typedef enum JZsdk_Widget_Control
{
// 控件类
JZSDK_WIDGET_LASTSONG = 0x0000, // 控件上一曲
JZSDK_WIDGET_NEXTSONG = 0x0001, // 控件下一曲
JZSDK_WIDGET_PLAYANDSTOP = 0x0002, // 控件播放暂停
JZSDK_WIDGET_SIDE_LASER_MODE = 0x0020,
JZSDK_WIDGET_VIDEOPUSH_INDEX = 0x0021, //切换视频流
JZSDK_WIDGET_TEMP_MEASUREMENT_MODE = 0x0022, //测温
JZSDK_WIDGET_SHUTTER_SWITCH = 0x0023, //快门开关
JZSDK_WIDGET_FREEZE_VIDEO = 0x0024, //冻结视频流
JZSDK_WIDGET_PSEUDO_MODE = 0x0025, //色彩输出模式
JZSDK_WIDGET_FOCAL_LENGTH = 0x0026, //焦距
JZSDK_WIDGET_SPC_RESET = 0x0027, //spc重置
JZSDK_WIDGET_PSEUDO_COLOR = 0x0028, //伪彩颜色
JZSDK_WIDGET_CAMERA_CORRECT_MODE = 0x0029, //相机纠正模式
JZSDK_WIDGET_GAS_ENHANCEMENT_COLOR = 0x0030, //气体增强颜色
JZSDK_WIDGET_SPC_MODE = 0x0031, //单点纠正模式
JZSDK_WIDGET_SPC_AUTO_TIME = 0x0032, //自动单点纠正间隔
JZSDK_WIDGET_TPC_MODE = 0x0033, //tpc模式
JZSDK_WIDGET_BAD_PIXEL_CORRECT_MODE = 0x0034, //坏点纠正模式
JZSDK_WIDGET_BAD_PIXEL_CORRECT = 0x0035, //开启纠正
JZSDK_WIDGET_GAS_ENHANCEMENT_CORRECT = 0x0036, //气体增强纠正
JZSDK_WIDGET_GAS_ENHANCEMENT_CORRECT_HIGH_CALIBRATION = 0x0037, //气体增强纠正高温校准
JZSDK_WIDGET_GAS_ENHANCEMENT_CORRECT_LOW_CALIBRATION = 0x0038, //气体增强纠正低温校准
}JZsdk_Widget_Control;
/* Exported types ------------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/
#ifdef __cplusplus
}
#endif
#endif
... ...
... ... @@ -93,6 +93,11 @@ static int Comparison_5AFRAME_FirstLevelCode_0x51(char *getdata)
return JZ_INSCODE_5AFRAME_AUDIOFILE_TRANS_STOP;
break;
//关闭音频文件上传并校验
case 0x04:
return JZ_INSCODE_5AFRAME_AUDIOFILE_TRANS_STOP_AND_CHECK;
break;
default:
return JZ_ERROR_SYSTEM_FRAME_ERROR;
break;
... ... @@ -199,7 +204,7 @@ static int Comparison_5AFRAME_FirstLevelCode_0x53(char *getdata)
case 0x07:
return JZ_INSCODE_5AFRAME_CHECKSTATUS_TTSSPEED;
break;
//查询软件版本号
case 0xf1:
return JZ_INSCODE_5AFRAME_CHECKSTATUS_SOFTWAREVERSION;
... ... @@ -248,6 +253,11 @@ static int Comparison_5AFRAME_FirstLevelCode_0x55(char *getdata)
return JZ_INSCODE_5AFRAME_PLAY_LOOP;
break;
//设置循环播放间隔
case 0x01:
return JZ_INSCODE_5AFRAME_CHECKSTATUS_ADUIO_LOOP_INTERVAL;
break;
default:
return JZ_ERROR_SYSTEM_FRAME_ERROR;
break;
... ... @@ -309,6 +319,11 @@ static int Comparison_5AFRAME_FirstLevelCode_0x58(char *getdata)
return JZ_INSCODE_5AFRAME_AUDIO_GETMUSICLIST;
break;
//查询歌曲类音频详细信息
case 0x03:
return JZ_INSCODE_5AFRAME_CHECKSTATUS_AUDIO_DETAIL_MESSAGE;
break;
default:
break;
}
... ... @@ -330,6 +345,10 @@ static int Comparison_5AFRAME_FirstLevelCode_0x59(char *getdata)
return JZ_INSCODE_5AFRAME_OPUS_TRANS_STOP;
break;
case 0xF4:
return JZ_INSCODE_5AFRAME_OPUS_TRANS_STOP_AND_CHECK;
break;
//opus定长传输
case 0xF3:
return JZ_INSCODE_5AFRAME_OPUS_TRANS_LIMIT_TRANSMISSION;
... ...
... ... @@ -138,6 +138,11 @@ static int Comparison_5BFRAME_FirstLevelCode_0x58(char *getdata)
return JZ_INSCODE_5BFRAME_MUSICLIST_TRANS;
break;
//查询歌曲类音频详细信息
case 0x03:
return JZ_INSCODE_5BFRAME_CHECKSTATUS_AUDIO_DETAIL_MESSAGE;
break;
//结束列表返回
case 0xff:
return JZ_INSCODE_5BFRAME_MUSICLIST_STOP;
... ...
... ... @@ -283,6 +283,20 @@ int JZsdk_GetFrameTemplate(int InsCode ,char *str, int *str_len)
*str_len = 12;
}
break;
case JZ_INSCODE_5BFRAME_FILE_CHECK_DEFEAT:
{
char sendbuf[12] = {0x5B, 0x5B, 0x77, 0x00, 0x0c, 0x00, 0x00, 0x51, 0xf0, 0x00, 0x00, 0x23};
memcpy(str, sendbuf, 12);
*str_len = 12;
}
case JZ_INSCODE_5BFRAME_FILE_DECODE_DEFEAT:
{
char sendbuf[12] = {0x5B, 0x5B, 0x77, 0x00, 0x0c, 0x00, 0x00, 0x51, 0xf1, 0x00, 0x00, 0x23};
memcpy(str, sendbuf, 12);
*str_len = 12;
}
case JZ_INSCODE_5BFRAME_DEFEAT:
{
... ... @@ -383,14 +397,22 @@ int JZsdk_GetFrameTemplate(int InsCode ,char *str, int *str_len)
}
break;
case JZ_INSCODE_5BFRAME_OPUS_DECODE_STATUS:
case JZ_INSCODE_5BFRAME_CHECKSTATUS_AUDIO_DETAIL_MESSAGE:
{
char sendbuf[12] = { 0x5b, 0x5b, 0x77, 0x00, 0x0c, 0x00, 0x00, 0x59, 0xf2, 0x00, 0x00, 0x23};
char sendbuf[12] = { 0x5b, 0x5b, 0x77, 0x00, 0x0c, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x23};
memcpy(str, sendbuf, 12);
*str_len = 12;
}
break;
case JZ_INSCODE_5BFRAME_OPUS_DECODE_STATUS:
{
char sendbuf[13] = { 0x5b, 0x5b, 0x77, 0x00, 0x0D, 0x00, 0x00, 0x59, 0xf2, 0x00, 0x00, 0x00, 0x23};
memcpy(str, sendbuf, 13);
*str_len = 13;
}
break;
case JZ_INSCODE_5BFRAME_CHECKSTATUS_OUTPUTPOWER:
{
char sendbuf[12] = { 0x5b, 0x5b, 0x77, 0x00, 0x0C, 0x00, 0x00, 0x5A, 0x02, 0x00, 0x00, 0x23};
... ...
#include <stdio.h>
#include "JZsdkLib.h"
#include "./CheckSum_Src.h"
static const U8_t c_crc4_itu_lk[] =
{
0x00,0x07,0x0E,0x09,0x05,0x02,0x0B,0x0C,0x0A,0x0D,0x04,0x03,0x0F,0x08,0x01,0x06,
0x0D,0x0A,0x03,0x04,0x08,0x0F,0x06,0x01,0x07,0x00,0x09,0x0E,0x02,0x05,0x0C,0x0B,
0x03,0x04,0x0D,0x0A,0x06,0x01,0x08,0x0F,0x09,0x0E,0x07,0x00,0x0C,0x0B,0x02,0x05,
0x0E,0x09,0x00,0x07,0x0B,0x0C,0x05,0x02,0x04,0x03,0x0A,0x0D,0x01,0x06,0x0F,0x08,
0x06,0x01,0x08,0x0F,0x03,0x04,0x0D,0x0A,0x0C,0x0B,0x02,0x05,0x09,0x0E,0x07,0x00,
0x0B,0x0C,0x05,0x02,0x0E,0x09,0x00,0x07,0x01,0x06,0x0F,0x08,0x04,0x03,0x0A,0x0D,
0x05,0x02,0x0B,0x0C,0x00,0x07,0x0E,0x09,0x0F,0x08,0x01,0x06,0x0A,0x0D,0x04,0x03,
0x08,0x0F,0x06,0x01,0x0D,0x0A,0x03,0x04,0x02,0x05,0x0C,0x0B,0x07,0x00,0x09,0x0E,
0x0C,0x0B,0x02,0x05,0x09,0x0E,0x07,0x00,0x06,0x01,0x08,0x0F,0x03,0x04,0x0D,0x0A,
0x01,0x06,0x0F,0x08,0x04,0x03,0x0A,0x0D,0x0B,0x0C,0x05,0x02,0x0E,0x09,0x00,0x07,
0x0F,0x08,0x01,0x06,0x0A,0x0D,0x04,0x03,0x05,0x02,0x0B,0x0C,0x00,0x07,0x0E,0x09,
0x02,0x05,0x0C,0x0B,0x07,0x00,0x09,0x0E,0x08,0x0F,0x06,0x01,0x0D,0x0A,0x03,0x04,
0x0A,0x0D,0x04,0x03,0x0F,0x08,0x01,0x06,0x00,0x07,0x0E,0x09,0x05,0x02,0x0B,0x0C,
0x07,0x00,0x09,0x0E,0x02,0x05,0x0C,0x0B,0x0D,0x0A,0x03,0x04,0x08,0x0F,0x06,0x01,
0x09,0x0E,0x07,0x00,0x0C,0x0B,0x02,0x05,0x03,0x04,0x0D,0x0A,0x06,0x01,0x08,0x0F,
0x04,0x03,0x0A,0x0D,0x01,0x06,0x0F,0x08,0x0E,0x09,0x00,0x07,0x0B,0x0C,0x05,0x02,
};
/******************************************************************************
* Name: CRC-4/ITU with lookup table x4+x+1
* Poly: 0x03
* Init: 0x00
* Refin: True
* Refout: True
* Xorout: 0x00
* Note:
*****************************************************************************/
U8_t crc4_itu_lk(U8_t *data, unsigned int length)
{
U8_t i;
U8_t crc = 0; // Initial value
while(length--)
{
crc ^= *data++; // crc ^= *data; data++;
crc = c_crc4_itu_lk[crc];
}
return crc;
}
/******************************************************************************
* Name: CRC-4/ITU x4+x+1
* Poly: 0x03
* Init: 0x00
* Refin: True
* Refout: True
* Xorout: 0x00
* Note:
*****************************************************************************/
U8_t crc4_itu(U8_t *data, unsigned int length)
{
U8_t i;
U8_t crc = 0; // Initial value
while(length--)
{
crc ^= *data++; // crc ^= *data; data++;
for (i = 0; i < 8; ++i)
{
if (crc & 1)
crc = (crc >> 1) ^ 0x0C;// 0x0C = (reverse 0x03)>>(8-4)
else
crc = (crc >> 1);
}
}
return crc;
}
/******************************************************************************
* Name: CRC-5/EPC x5+x3+1
* Poly: 0x09
* Init: 0x09
* Refin: False
* Refout: False
* Xorout: 0x00
* Note:
*****************************************************************************/
U8_t crc5_epc(U8_t *data, unsigned int length)
{
U8_t i;
U8_t crc = 0x48; // Initial value: 0x48 = 0x09<<(8-5)
while(length--)
{
crc ^= *data++; // crc ^= *data; data++;
for ( i = 0; i < 8; i++ )
{
if ( crc & 0x80 )
crc = (crc << 1) ^ 0x48; // 0x48 = 0x09<<(8-5)
else
crc <<= 1;
}
}
return crc >> 3;
}
/******************************************************************************
* Name: CRC-5/ITU x5+x4+x2+1
* Poly: 0x15
* Init: 0x00
* Refin: True
* Refout: True
* Xorout: 0x00
* Note:
*****************************************************************************/
U8_t crc5_itu(U8_t *data, unsigned int length)
{
U8_t i;
U8_t crc = 0; // Initial value
while(length--)
{
crc ^= *data++; // crc ^= *data; data++;
for (i = 0; i < 8; ++i)
{
if (crc & 1)
crc = (crc >> 1) ^ 0x15;// 0x15 = (reverse 0x15)>>(8-5)
else
crc = (crc >> 1);
}
}
return crc;
}
/******************************************************************************
* Name: CRC-5/USB x5+x2+1
* Poly: 0x05
* Init: 0x1F
* Refin: True
* Refout: True
* Xorout: 0x1F
* Note:
*****************************************************************************/
U8_t crc5_usb(U8_t *data, unsigned int length)
{
U8_t i;
U8_t crc = 0x1F; // Initial value
while(length--)
{
crc ^= *data++; // crc ^= *data; data++;
for (i = 0; i < 8; ++i)
{
if (crc & 1)
crc = (crc >> 1) ^ 0x14;// 0x14 = (reverse 0x05)>>(8-5)
else
crc = (crc >> 1);
}
}
return crc ^ 0x1F;
}
/******************************************************************************
* Name: CRC-6/ITU x6+x+1
* Poly: 0x03
* Init: 0x00
* Refin: True
* Refout: True
* Xorout: 0x00
* Note:
*****************************************************************************/
U8_t crc6_itu(U8_t *data, unsigned int length)
{
U8_t i;
U8_t crc = 0; // Initial value
while(length--)
{
crc ^= *data++; // crc ^= *data; data++;
for (i = 0; i < 8; ++i)
{
if (crc & 1)
crc = (crc >> 1) ^ 0x30;// 0x30 = (reverse 0x03)>>(8-6)
else
crc = (crc >> 1);
}
}
return crc;
}
/******************************************************************************
* Name: CRC-7/MMC x7+x3+1
* Poly: 0x09
* Init: 0x00
* Refin: False
* Refout: False
* Xorout: 0x00
* Use: MultiMediaCard,SD,ect.
*****************************************************************************/
U8_t crc7_mmc(U8_t *data, unsigned int length)
{
U8_t i;
U8_t crc = 0; // Initial value
while(length--)
{
crc ^= *data++; // crc ^= *data; data++;
for ( i = 0; i < 8; i++ )
{
if ( crc & 0x80 )
crc = (crc << 1) ^ 0x12; // 0x12 = 0x09<<(8-7)
else
crc <<= 1;
}
}
return crc >> 1;
}
/******************************************************************************
* Name: CRC-8 x8+x2+x+1
* Poly: 0x07
* Init: 0x00
* Refin: False
* Refout: False
* Xorout: 0x00
* Note:
*****************************************************************************/
U8_t crc8(U8_t *data, unsigned int length)
{
U8_t i;
U8_t crc = 0; // Initial value
while(length--)
{
crc ^= *data++; // crc ^= *data; data++;
for ( i = 0; i < 8; i++ )
{
if ( crc & 0x80 )
crc = (crc << 1) ^ 0x07;
else
crc <<= 1;
}
}
return crc;
}
/******************************************************************************
* Name: CRC-8/ITU x8+x2+x+1
* Poly: 0x07
* Init: 0x00
* Refin: False
* Refout: False
* Xorout: 0x55
* Alias: CRC-8/ATM
*****************************************************************************/
U8_t crc8_itu(U8_t *data, unsigned int length)
{
U8_t i;
U8_t crc = 0; // Initial value
while(length--)
{
crc ^= *data++; // crc ^= *data; data++;
for ( i = 0; i < 8; i++ )
{
if ( crc & 0x80 )
crc = (crc << 1) ^ 0x07;
else
crc <<= 1;
}
}
return crc ^ 0x55;
}
/******************************************************************************
* Name: CRC-8/ROHC x8+x2+x+1
* Poly: 0x07
* Init: 0xFF
* Refin: True
* Refout: True
* Xorout: 0x00
* Note:
*****************************************************************************/
U8_t crc8_rohc(U8_t *data, unsigned int length)
{
U8_t i;
U8_t crc = 0xFF; // Initial value
while(length--)
{
crc ^= *data++; // crc ^= *data; data++;
for (i = 0; i < 8; ++i)
{
if (crc & 1)
crc = (crc >> 1) ^ 0xE0; // 0xE0 = reverse 0x07
else
crc = (crc >> 1);
}
}
return crc;
}
/******************************************************************************
* Name: CRC-8/MAXIM x8+x5+x4+1
* Poly: 0x31
* Init: 0x00
* Refin: True
* Refout: True
* Xorout: 0x00
* Alias: DOW-CRC,CRC-8/IBUTTON
* Use: Maxim(Dallas)'s some devices,e.g. DS18B20
*****************************************************************************/
U8_t crc8_maxim(U8_t *data, unsigned int length)
{
U8_t i;
U8_t crc = 0; // Initial value
while(length--)
{
crc ^= *data++; // crc ^= *data; data++;
for (i = 0; i < 8; i++)
{
if (crc & 1)
crc = (crc >> 1) ^ 0x8C; // 0x8C = reverse 0x31
else
crc >>= 1;
}
}
return crc;
}
/******************************************************************************
* Name: CRC-16/IBM x16+x15+x2+1
* Poly: 0x8005
* Init: 0x0000
* Refin: True
* Refout: True
* Xorout: 0x0000
* Alias: CRC-16,CRC-16/ARC,CRC-16/LHA
*****************************************************************************/
uint16_t crc16_ibm(U8_t *data, unsigned int length)
{
U8_t i;
uint16_t crc = 0; // Initial value
while(length--)
{
crc ^= *data++; // crc ^= *data; data++;
for (i = 0; i < 8; ++i)
{
if (crc & 1)
crc = (crc >> 1) ^ 0xA001; // 0xA001 = reverse 0x8005
else
crc = (crc >> 1);
}
}
return crc;
}
/******************************************************************************
* Name: CRC-16/MAXIM x16+x15+x2+1
* Poly: 0x8005
* Init: 0x0000
* Refin: True
* Refout: True
* Xorout: 0xFFFF
* Note:
*****************************************************************************/
uint16_t crc16_maxim(U8_t *data, unsigned int length)
{
U8_t i;
uint16_t crc = 0; // Initial value
while(length--)
{
crc ^= *data++; // crc ^= *data; data++;
for (i = 0; i < 8; ++i)
{
if (crc & 1)
crc = (crc >> 1) ^ 0xA001; // 0xA001 = reverse 0x8005
else
crc = (crc >> 1);
}
}
return ~crc; // crc^0xffff
}
/******************************************************************************
* Name: CRC-16/USB x16+x15+x2+1
* Poly: 0x8005
* Init: 0xFFFF
* Refin: True
* Refout: True
* Xorout: 0xFFFF
* Note:
*****************************************************************************/
uint16_t crc16_usb(U8_t *data, unsigned int length)
{
U8_t i;
uint16_t crc = 0xffff; // Initial value
while(length--)
{
crc ^= *data++; // crc ^= *data; data++;
for (i = 0; i < 8; ++i)
{
if (crc & 1)
crc = (crc >> 1) ^ 0xA001; // 0xA001 = reverse 0x8005
else
crc = (crc >> 1);
}
}
return ~crc; // crc^0xffff
}
/******************************************************************************
* Name: CRC-16/MODBUS x16+x15+x2+1
* Poly: 0x8005
* Init: 0xFFFF
* Refin: True
* Refout: True
* Xorout: 0x0000
* Note:
*****************************************************************************/
uint16_t crc16_modbus(U8_t *data, unsigned int length)
{
U8_t i;
uint16_t crc = 0xffff; // Initial value
while(length--)
{
crc ^= *data++; // crc ^= *data; data++;
for (i = 0; i < 8; ++i)
{
if (crc & 1)
crc = (crc >> 1) ^ 0xA001; // 0xA001 = reverse 0x8005
else
crc = (crc >> 1);
}
}
return crc;
}
/******************************************************************************
* Name: CRC-16/CCITT x16+x12+x5+1
* Poly: 0x1021
* Init: 0x0000
* Refin: True
* Refout: True
* Xorout: 0x0000
* Alias: CRC-CCITT,CRC-16/CCITT-TRUE,CRC-16/KERMIT
*****************************************************************************/
uint16_t crc16_ccitt(U8_t *data, unsigned int length)
{
U8_t i;
uint16_t crc = 0; // Initial value
while(length--)
{
crc ^= *data++; // crc ^= *data; data++;
for (i = 0; i < 8; ++i)
{
if (crc & 1)
crc = (crc >> 1) ^ 0x8408; // 0x8408 = reverse 0x1021
else
crc = (crc >> 1);
}
}
return crc;
}
/******************************************************************************
* Name: CRC-16/CCITT-FALSE x16+x12+x5+1
* Poly: 0x1021
* Init: 0xFFFF
* Refin: False
* Refout: False
* Xorout: 0x0000
* Note:
*****************************************************************************/
uint16_t crc16_ccitt_false(U8_t *data, unsigned int length)
{
U8_t i;
uint16_t crc = 0xffff; //Initial value
while(length--)
{
crc ^= (uint16_t)(*data++) << 8; // crc ^= (uint6_t)(*data)<<8; data++;
for (i = 0; i < 8; ++i)
{
if ( crc & 0x8000 )
crc = (crc << 1) ^ 0x1021;
else
crc <<= 1;
}
}
return crc;
}
/******************************************************************************
* Name: CRC-16/X25 x16+x12+x5+1
* Poly: 0x1021
* Init: 0xFFFF
* Refin: True
* Refout: True
* Xorout: 0XFFFF
* Note:
*****************************************************************************/
uint16_t crc16_x25(U8_t *data, unsigned int length)
{
U8_t i;
uint16_t crc = 0xffff; // Initial value
while(length--)
{
crc ^= *data++; // crc ^= *data; data++;
for (i = 0; i < 8; ++i)
{
if (crc & 1)
crc = (crc >> 1) ^ 0x8408; // 0x8408 = reverse 0x1021
else
crc = (crc >> 1);
}
}
return ~crc; // crc^Xorout
}
/******************************************************************************
* Name: CRC-16/XMODEM x16+x12+x5+1
* Poly: 0x1021
* Init: 0x0000
* Refin: False
* Refout: False
* Xorout: 0x0000
* Alias: CRC-16/ZMODEM,CRC-16/ACORN
*****************************************************************************/
uint16_t crc16_xmodem(U8_t *data, unsigned int length)
{
U8_t i;
uint16_t crc = 0; // Initial value
while(length--)
{
crc ^= (uint16_t)(*data++) << 8; // crc ^= (uint16_t)(*data)<<8; data++;
for (i = 0; i < 8; ++i)
{
if ( crc & 0x8000 )
crc = (crc << 1) ^ 0x1021;
else
crc <<= 1;
}
}
return crc;
}
/******************************************************************************
* Name: CRC-16/DNP x16+x13+x12+x11+x10+x8+x6+x5+x2+1
* Poly: 0x3D65
* Init: 0x0000
* Refin: True
* Refout: True
* Xorout: 0xFFFF
* Use: M-Bus,ect.
*****************************************************************************/
uint16_t crc16_dnp(U8_t *data, unsigned int length)
{
U8_t i;
uint16_t crc = 0; // Initial value
while(length--)
{
crc ^= *data++; // crc ^= *data; data++;
for (i = 0; i < 8; ++i)
{
if (crc & 1)
crc = (crc >> 1) ^ 0xA6BC; // 0xA6BC = reverse 0x3D65
else
crc = (crc >> 1);
}
}
return ~crc; // crc^Xorout
}
/******************************************************************************
* Name: CRC-32 x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1
* Poly: 0x4C11DB7
* Init: 0xFFFFFFF
* Refin: True
* Refout: True
* Xorout: 0xFFFFFFF
* Alias: CRC_32/ADCCP
* Use: WinRAR,ect.
*****************************************************************************/
T_JZsdkReturnCode CheckSum_crc32(U8_t *data, unsigned int length, U32_t *ReturnCheckSum)
{
U8_t i;
U32_t crc = 0xffffffff; // Initial value
while(length--)
{
crc ^= *data++; // crc ^= *data; data++;
for (i = 0; i < 8; ++i)
{
if (crc & 1)
crc = (crc >> 1) ^ 0xEDB88320;// 0xEDB88320= reverse 0x04C11DB7
else
crc = (crc >> 1);
}
}
*ReturnCheckSum = ~crc; // crc^Xorout
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/******************************************************************************
* Name: CRC-32/MPEG-2 x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1
* Poly: 0x4C11DB7
* Init: 0xFFFFFFF
* Refin: False
* Refout: False
* Xorout: 0x0000000
* Note:
*****************************************************************************/
U32_t crc32_mpeg_2(U8_t *data, unsigned int length)
{
U8_t i;
U32_t crc = 0xffffffff; // Initial value
while(length--)
{
crc ^= (U32_t)(*data++) << 24;// crc ^=(U32_t)(*data)<<24; data++;
for (i = 0; i < 8; ++i)
{
if ( crc & 0x80000000 )
crc = (crc << 1) ^ 0x04C11DB7;
else
crc <<= 1;
}
}
return crc;
}
/*---------------------------------------------------------------------------*/
\ No newline at end of file
... ...
/**
********************************************************************
* @file JZsdk_FileSystem.h
* 用于文件系统操作
*
*********************************************************************
*/
/* Define to prevent recursive inclusion 避免重定义 -------------------------------------*/
#ifndef CHECK_SUM_H
#define CHECK_SUM_H
/* Includes ------------------------------------------------------------------*/
#include "../../JZsdk_Code/JZsdk_Code.h"
#ifdef __cplusplus
extern "C" {
#endif
/* Exported constants --------------------------------------------------------*/
/* 常亮定义*/
/* Exported types ------------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/
T_JZsdkReturnCode CheckSum_crc32(U8_t *data, unsigned int length, U32_t *ReturnCheckSum);
T_JZsdkReturnCode CheckSum_crc32(U8_t *data, unsigned int length, U32_t *ReturnCheckSum);
#ifdef __cplusplus
}
#endif
#endif
/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/
... ...
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "sys/stat.h"
#include "stdint.h"
#include "JZsdkLib.h"
#include "./CheckSum_Src.h"
#include "./JZsdk_CheckSum.h"
static T_JZsdkReturnCode JZsdk_Check_Src32(unsigned char *DIR, unsigned char *checksum, unsigned int checksum_len)
{
T_JZsdkReturnCode ret = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
//1、计算得到校验码
U32_t LocalCheckSum = 0;
//2、将数据读取出来
FILE* fp = NULL;
unsigned char* pbuf = NULL;
struct stat st;
if (stat(DIR, &st) != 0)
{
JZSDK_LOG_ERROR("stat file error\n");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
fflush(stdout);
pbuf = (unsigned char*)malloc(st.st_size);
if (pbuf == NULL)
{
JZSDK_LOG_ERROR("malloc error [%ld]\n", st.st_size);
return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
fp = fopen(DIR, "rb");
if (fp == NULL)
{
printf("open file error %s\n", DIR);
free(pbuf);
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
fread(pbuf, 1, st.st_size, fp);
CheckSum_crc32((U8_t*)pbuf, st.st_size, &LocalCheckSum);
fclose(fp);
//3、校验
//将unsigned char的码值转换成U32_t
U32_t CheckSum = 0;
memcpy(&CheckSum, checksum, checksum_len);
if (CheckSum != LocalCheckSum)
{
JZSDK_LOG_ERROR("checksum error\n");
ret = JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
else
{
JZSDK_LOG_INFO("checksum success\n");
ret = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
free(pbuf);
return ret;
}
static T_JZsdkReturnCode JZsdk_Check_Md5(unsigned char *DIR, unsigned char *checksum, unsigned int checksum_len)
{
T_JZsdkReturnCode ret = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
//1、获取文件的md5校验码
unsigned char cmd[256];
unsigned char md5[32];
memset(cmd,0,sizeof(cmd));
snprintf(cmd, sizeof(cmd), "md5sum %s", DIR);
JZsdk_RunSystemCmd_ReturnResult_Str(cmd, md5);
//对比校验码
if (memcmp(md5, checksum, 21) != 0)
{
JZSDK_LOG_ERROR("checksum error\n");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
return ret;
}
T_JZsdkReturnCode JZsdk_CheckSum(T_JZsdkCheckSumType CheckSumType, unsigned char *DIR, unsigned char *checksum, unsigned int checksum_len)
{
T_JZsdkReturnCode ret = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
switch (CheckSumType)
{
case JZSDK_CHECK_SUM_TYPE_MD5:
return JZsdk_Check_Md5(DIR, checksum, checksum_len);
break;
case JZSDK_CHECK_SUM_TYPE_SRC32:
return JZsdk_Check_Src32(DIR, checksum, checksum_len);
break;
default:
break;
}
return ret;
}
\ No newline at end of file
... ...
/**
********************************************************************
* @file JZsdk_CheckSum.h
*
*
*********************************************************************
*/
/* Define to prevent recursive inclusion 避免重定义 -------------------------------------*/
#ifndef JZSDK_CHECK_SUM_H
#define JZSDK_CHECK_SUM_H
/* Includes ------------------------------------------------------------------*/
#include "../../JZsdk_Code/JZsdk_Code.h"
#ifdef __cplusplus
extern "C" {
#endif
/* Exported constants --------------------------------------------------------*/
/* 常亮定义*/
typedef enum T_JZsdkCheckSumType
{
JZSDK_CHECK_SUM_TYPE_NONE = 0x0000,
JZSDK_CHECK_SUM_TYPE_MD5 = 0x0001,
JZSDK_CHECK_SUM_TYPE_SRC32 = 0x0002,
}T_JZsdkCheckSumType;
/* Exported types ------------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/
T_JZsdkReturnCode JZsdk_CheckSum(T_JZsdkCheckSumType CheckSumType, unsigned char *DIR, unsigned char *checksum, unsigned int checksum_len);
#ifdef __cplusplus
}
#endif
#endif
/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/
... ...
... ... @@ -12,6 +12,7 @@
#define JZSDK_FILENAME_SIZE (128) //文件名最大长度128
#define JZSDK_CMD_SIZE (256) //cmd指令最大长度
#define JZSDK_DIR_SIZE (256) //目录名最大长度
#endif
\ No newline at end of file
... ...
... ... @@ -4,6 +4,7 @@
#include <stdbool.h>
#include <string.h>
#include <unistd.h>
#include <math.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "JZsdkLib.h"
... ... @@ -49,17 +50,58 @@ T_JZsdkReturnCode JZsdk_RunSystemCmd(char *systemCmd)
运行命令 并读取返回值
*/
// FILE* JZsdk_RunSystemCmd_ReturnFilePointer(char *systemCmd)
// {
// FILE *fp;
T_JZsdkReturnCode JZsdk_RunSystemCmd_ReturnResult(char *systemCmd, unsigned int *result)
{
FILE *fp;
double temp = 0;
// fp = popen(systemCmd, "r");
fp = popen(systemCmd, "r");
if (fp == NULL) {
printf("Failed to run command\n");
}
// 读取并转换时长(这里假设ffprobe的输出只有一行)
if (fscanf(fp, "%lf", &temp) != 1)
{
pclose(fp);
printf("Failed to read duration\n");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
pclose(fp);
// pclose(fp);
*result = (unsigned int)ceil(temp);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/*
运行命令 并读取返回值
*/
T_JZsdkReturnCode JZsdk_RunSystemCmd_ReturnResult_Str(char *systemCmd, unsigned char *str)
{
FILE *fp;
double temp = 0;
// return fp;
// }
fp = popen(systemCmd, "r");
if (fp == NULL) {
printf("Failed to run command\n");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
// 读取命令的输出
while (fgets(str, sizeof(str)-1, fp) != NULL)
{
printf("%s", str);
}
pclose(fp);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/**********************************
*
... ... @@ -369,18 +411,38 @@ T_JZsdkReturnCode JZsdk_Fs_ReadFileSize(const unsigned char* FilePath, int *File
{
struct stat statbuf;
int result = stat(FilePath, &statbuf);
if (result == -1) {
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
// 检查 errno 以确定错误原因
if (errno == EACCES)
{
// 没有读取文件的权限
JZSDK_LOG_ERROR("无权限");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
else if (errno == ENOENT)
{
// 文件不存在
JZSDK_LOG_ERROR("无文件");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
else {
// 其他错误
JZSDK_LOG_ERROR("读取错误");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
}
//JZSDK_LOG_DEBUG("%s %d",FilePath, statbuf.st_size);
*FileSize = statbuf.st_size;
if (*FileSize == 0)
{
// 文件大小为0,可能是空文件
JZSDK_LOG_ERROR("文件大小为空");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
\ No newline at end of file
}
... ...
... ... @@ -37,10 +37,11 @@ T_JZsdkReturnCode JZsdk_create_hardlink(const char* target_path, const char* lin
T_JZsdkReturnCode JZsdk_check_directory_exists_posix(const char* directory_path);
T_JZsdkReturnCode JZsdk_Fs_ReadFileSize(const unsigned char* FilePath, int *FileSize);
T_JZsdkReturnCode JZsdk_copy_file_byC(const char* source_path, const char* dest_path);
T_JZsdkReturnCode JZsdk_RunSystemCmd_ReturnResult(char *systemCmd, unsigned int *result);
T_JZsdkReturnCode JZsdk_RunSystemCmd_ReturnResult_Str(char *systemCmd, unsigned char *str);
#ifdef __cplusplus
}
#endif
#endif
/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/
... ...
... ... @@ -14,6 +14,7 @@
#include "BaseConfig.h"
#include "Psdk_UI_io.h"
#include "Lighting_InAndOut.h"
#include "JZsdk_network/JZsdk_network.h"
... ... @@ -32,7 +33,7 @@
#include "Megaphone/Megaphone.h"
#endif
#if SIDE_LASER_STATUS_ON
#ifdef SIDE_LASER_STATUS_ON
#include "SideLaser/SideLaser.h"
#endif
... ... @@ -77,7 +78,7 @@ T_JZsdkReturnCode Main_M30_all_filter_mode(int *mode)
Megaphone_StopPlay(JZ_FLAGCODE_OFF);
//修改滤波
AudioDeal_FilterReset(0x01);
AudioDeal_SetFilterMode(0x01);
}
else
{
... ... @@ -85,7 +86,7 @@ T_JZsdkReturnCode Main_M30_all_filter_mode(int *mode)
Megaphone_StopPlay(JZ_FLAGCODE_OFF);
//修改滤波
AudioDeal_FilterReset(0x00);
AudioDeal_SetFilterMode(0x00);
}
}
... ... @@ -147,14 +148,12 @@ T_JZsdkReturnCode Main_APP_Psdk()
JZsdk_data_transmisson_Receive_Init();
//喊话器功能被打开时
if (MEGAPHONE_CONFIG_STATUS == VERSION_SWITCH_ON)
{
#if MEGAPHONE_CONFIG_STATUS == VERSION_SWITCH_ON
//音频库初始化
AudioDeal_Init();
//
}
#endif
if (DEVICE_VERSION == TF_A1)
{
... ... @@ -290,7 +289,7 @@ T_JZsdkReturnCode Main_APP_Psdk()
//灯类初始化
Lighting_Init();
#if SIDE_LASER_STATUS_ON
#ifdef SIDE_LASER_STATUS_ON
//侧边激光初始化
SideLaser_Init();
#endif
... ... @@ -300,6 +299,29 @@ T_JZsdkReturnCode Main_APP_Psdk()
JZsdk_Uart_Send_MessageSubcription_Control(UART_DEV_2, JZ_FLAGCODE_ON);
}
else if (DEVICE_VERSION == JZ_U3D)
{
//串口设备1初始化
//JZsdk_Uart_Init(UART_DEV_1);
//串口设备2初始化
JZsdk_Uart_Init(UART_DEV_2);
//喊话器初始化
Megaphone_Init();
//云台初始化
Gimbal_Init();
//灯类初始化
Lighting_Init();
delayMs(1000);
//消息订阅初始化
JZsdk_Uart_Send_MessageSubcription_Control(UART_DEV_2, JZ_FLAGCODE_ON);
}
else if (DEVICE_VERSION == JZ_C1)
{
//引脚初始化
... ... @@ -339,13 +361,11 @@ int Main_APP_Uart()
Main_WorkMode();
//喊话器功能被打开时
if (MEGAPHONE_CONFIG_STATUS == VERSION_SWITCH_ON)
{
#if MEGAPHONE_CONFIG_STATUS == VERSION_SWITCH_ON
//音频库初始化
AudioDeal_Init();
//
}
#endif
if (DEVICE_VERSION == JZ_H1E)
{
... ... @@ -465,6 +485,63 @@ int Main_APP_Uart()
}
else if (DEVICE_VERSION == JZ_U3S)
{
//串口设备1初始化
JZsdk_Uart_Init(UART_DEV_1);
//串口设备2初始化
JZsdk_Uart_Init(UART_DEV_2);
//喊话器初始化
Megaphone_Init();
//云台初始化
Gimbal_Init();
//灯类初始化
Lighting_Init();
#ifdef SIDE_LASER_STATUS_ON
//侧边激光初始化
SideLaser_Init();
#endif
delayMs(1000);
//消息订阅初始化
JZsdk_Uart_Send_MessageSubcription_Control(UART_DEV_2, JZ_FLAGCODE_ON);
}
else if (DEVICE_VERSION == JZ_U3D)
{
//串口设备1初始化
JZsdk_Uart_Init(UART_DEV_1);
//串口设备2初始化
JZsdk_Uart_Init(UART_DEV_2);
//喊话器初始化
Megaphone_Init();
//云台初始化
Gimbal_Init();
//灯类初始化
Lighting_Init();
delayMs(1000);
//消息订阅初始化
JZsdk_Uart_Send_MessageSubcription_Control(UART_DEV_2, JZ_FLAGCODE_ON);
// delayS(3);
// JZSDK_LOG_INFO("开起发光");
// //开灯
// UIcontrol_SearchLightControl(UART_DEV_1, 0x02);
// UIcontrol_Set_SearchLightLumen(UART_DEV_1, 1, 100, 100);
}
if (DEVICE_VERSION == TF_A1)
... ... @@ -598,11 +675,13 @@ static void *Main_WorkModeTask(void *arg)
int start_voice_flag = JZ_FLAGCODE_OFF;
#if APP_VERSION == APP_UART
for (i = 0; i < 60; i++)
for (i = 0; i < JZsdk_ParamterParsing_GetTimeOutTime() ; i++)
{
#if CONNECTION_TIMED_OUT == VERSION_SWITCH_OFF
break;
#endif
if (JZsdk_ParamterParsing_GetTimeOutFlag() == JZ_FLAGCODE_OFF)
{
break;
}
delayMs(1000);//延迟一秒钟
printf("计数%d\n",i);
... ... @@ -622,9 +701,9 @@ static void *Main_WorkModeTask(void *arg)
}
}
if(i==60 && WorkMode == JZ_FLAGCODE_OFF && CONNECTION_TIMED_OUT == VERSION_SWITCH_ON)
if( i==JZsdk_ParamterParsing_GetTimeOutTime() && WorkMode == JZ_FLAGCODE_OFF && JZsdk_ParamterParsing_GetTimeOutFlag() == VERSION_SWITCH_ON)
{
printf("串口连接超时,回到连接psdk");
JZSDK_LOG_ERROR("串口连接超时,回到连接psdk");
exit(0);
}
#elif APP_VERSION == APP_PSDK
... ...
... ... @@ -13,6 +13,8 @@
/* Includes ------------------------------------------------------------------*/
#include "version_choose.h"
#include "JZsdkLib.h"
#include "./ParamterParsing.h"
#ifdef __cplusplus
extern "C" {
#endif
... ...
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h> // 包含getopt函数
#include <ctype.h>
#include "JZsdkLib.h"
#include "./ParamterParsing.h"
static int Timeout_flag = JZ_FLAGCODE_OFF; //超时标记位,默认关闭
static int Timeout_time = 60; //超时时间
int JZsdk_ParamterParsing_GetTimeOutFlag()
{
return Timeout_flag;
}
int JZsdk_ParamterParsing_GetTimeOutTime()
{
return Timeout_time;
}
/*************************************
*
* * 程序参数解析
* * 输入:参数字符串
*
*
* ********************************/
T_JZsdkReturnCode JZsdk_ParamterParsing(int argc, char *argv[])
{
JZSDK_LOG_INFO("参数解析");
int c;
// getopt_long 需要长选项,但这里我们只使用短选项
// getopt循环将逐个处理选项,直到没有更多选项
while ((c = getopt(argc, argv, "f:t:")) != -1)
{
switch (c) {
case 'f': //超时标记位
Timeout_flag = atoi(optarg);
break;
case 't': //超时时间
Timeout_time = atoi(optarg);
break;
case '?':
// 如果getopt遇到一个它不认识的选项,它会打印一个消息到stderr
// 并返回'?'。然后我们可以选择退出或给出更多帮助。
if (isprint(optopt))
JZSDK_LOG_ERROR("Unknown option `-%c'.", optopt);
else
JZSDK_LOG_ERROR("Unknown option character `\\x%x'.", optopt);
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
default:
break;
}
}
JZSDK_LOG_INFO("参数解析成功");
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
\ No newline at end of file
... ...
/**
********************************************************************
* @file ParamterParsing.h
* 用于文件系统操作
*
*********************************************************************
*/
/* Define to prevent recursive inclusion 避免重定义 -------------------------------------*/
#ifndef JZSDK_PARAMTERPARSING_H
#define JZSDK_PARAMTERPARSING_H
/* Includes ------------------------------------------------------------------*/
#include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
#ifdef __cplusplus
extern "C" {
#endif
/* Exported constants --------------------------------------------------------*/
/* 常亮定义*/
/* Exported types ------------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/
T_JZsdkReturnCode JZsdk_ParamterParsing(int argc, char *argv[]);
int JZsdk_ParamterParsing_GetTimeOutFlag();
int JZsdk_ParamterParsing_GetTimeOutTime();
#ifdef __cplusplus
}
#endif
#endif
... ...
... ... @@ -7,7 +7,7 @@
#define VERSION_CHOOSE_H
#include "./ConfigParams.h"
//1~10行 除了D可以修改版本选择 禁止动任何东西
#define DEVICE_VERSION JZ_H1T
#define DEVICE_VERSION JZ_U3S
//禁止修改行 选择是串口程序 还是 psdk程序
#define APP_VERSION APP_UART
... ... @@ -19,7 +19,7 @@
#define MAJOR_VERSION 0x00
#define MINOR_VERSION 0x00
#define MODIFY_VERSION 0x02
#define DEBUG_VERSION 0x06
#define DEBUG_VERSION 0x07
//禁止修改行 滤波方式
#define FILTERING_TYPE HIGH_PASS_FILTERING
... ...
... ... @@ -18,6 +18,11 @@
#include "Megaphone/Megaphone.h"
#include "DeviceInfo/DeviceInfo.h"
#if (MEGAPHONE_CONFIG_STATUS == VERSION_SWITCH_ON)
#include "Megaphone/Megaphone.h"
#include "Megaphone/AudioFile/Megaphone_AudioFile.h"
#endif
static int UartRecvMode = 0;
static int SecondaryDeviceName = 0x00; // 从设备名,用于多设备相连时通知控制端 从机设备名
... ... @@ -552,7 +557,7 @@ static T_JZsdkReturnCode RecvDeal_SaveAudioFileTrans_LimitTransmission(int Port,
**********/
static T_JZsdkReturnCode RecvDeal_SaveAudioFileTrans_stop(int Port, char *getbuf)
{
JZSDK_LOG_INFO("%s,开始传输的音频文件保存",RecvDeal_GetPortName(Port));
JZSDK_LOG_INFO("%s,传输的音频文件保存",RecvDeal_GetPortName(Port));
//获取帧的序列号
int FrameSequence = JZsdk_Get_FrameSequence(getbuf);
... ... @@ -567,7 +572,7 @@ static T_JZsdkReturnCode RecvDeal_SaveAudioFileTrans_stop(int Port, char *getbuf
//1、保存音频数据
#if MEGAPHONE_CONFIG_STATUS == VERSION_SWITCH_ON
Megaphone_SaveAudioFileStop();
Megaphone_SaveAudioFileStop(JZ_FLAGCODE_OFF, NULL);
#endif
//3、调整接收模式为音频文件传输
... ... @@ -577,6 +582,87 @@ static T_JZsdkReturnCode RecvDeal_SaveAudioFileTrans_stop(int Port, char *getbuf
JZsdk_Uart_SendDeal_Reply_Sucesss(Port, FrameSequence);
}
/*********
*
* 关闭音频文件上传, 并校验
*
*
**********/
static T_JZsdkReturnCode RecvDeal_SaveAudioFileTrans_stop_and_check(int Port, char *getbuf)
{
T_JZsdkReturnCode ret;
JZSDK_LOG_INFO("%s,传输的音频文件保存并校验",RecvDeal_GetPortName(Port));
//获取帧的序列号
int FrameSequence = JZsdk_Get_FrameSequence(getbuf);
if (UartRecvMode != JZ_INSCODE_5AFRAME_AUDIOFILE_TRANS_UNLIMIT_TRANSMISSION)
{
//回复操作失败
JZsdk_Uart_SendDeal_Reply_Failure(Port, FrameSequence);
JZSDK_LOG_ERROR("关闭音频文件上传失败,音频文件上传未开始,无法关闭");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
unsigned char checkCode[128];
int frameLenth = ((int)getbuf[3]) << 8 | (int)getbuf[4];
int CodeLenth = frameLenth - 10 - 2;
if (CodeLenth != 0)
{
memcpy(checkCode, &getbuf[10], CodeLenth);
JZSDK_LOG_INFO("checkCode :%s", checkCode);
}
else
{
JZsdk_Uart_SendDeal_Reply_Failure(Port, FrameSequence);
JZSDK_LOG_ERROR("关闭音频文件上传失败,校验码长度为0");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
//获取校验方式
int checkType = 0;
if (getbuf[9] == 0)
{
checkType = JZSDK_CHECK_SUM_TYPE_MD5;
}
else if (getbuf[9] == 1)
{
checkType = JZSDK_CHECK_SUM_TYPE_SRC32;
}
else
{
checkType = JZSDK_CHECK_SUM_TYPE_MD5;
}
//1、保存音频数据
#if MEGAPHONE_CONFIG_STATUS == VERSION_SWITCH_ON
ret = Megaphone_SaveAudioFileStop(checkType, checkCode);
if (ret == JZ_ERROR_CHECKCODE_CHECK_ERROR)
{
JZsdk_Uart_SendDeal_Reply_CheckError(Port, FrameSequence);
}
else if (ret == JZ_ERROR_CHECKCODE_DECODE_ERROR)
{
JZsdk_Uart_SendDeal_Reply_DecodeError(Port, FrameSequence);
}
else if (ret == JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
//回复操作成功
JZsdk_Uart_SendDeal_Reply_Sucesss(Port, FrameSequence);
}
else
{
//回复操作失败
JZsdk_Uart_SendDeal_Reply_Failure(Port, FrameSequence);
}
#endif
//3、调整接收模式为音频文件传输
JZsdk_Uart_RecvDeal_Set_UartReceiveMode(Port, JZ_INSCODE_5AFRAME_AUDIOFILE_TRANS_STOP);
}
/*********
*
* 播放指定音频
... ... @@ -798,6 +884,125 @@ static T_JZsdkReturnCode RecvDeal_audio_GetMusicList(int Port, char *getbuf)
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/*************
*
* 获取音频详细信息
*
*
**************/
static T_JZsdkReturnCode RecvDeal_CheckStatus_AudioDetailMessage(int Port, char *getbuf)
{
T_JZsdkReturnCode ret;
JZSDK_LOG_INFO("%s,获取音频详细信息",RecvDeal_GetPortName(Port));
//获取帧的序列号
int FrameSequence = JZsdk_Get_FrameSequence(getbuf);
//解析帧
//1、解析列表归属
int ListBelong = getbuf[9];
//2、解析查询的内容
int QueryContent = getbuf[10];
//3、解析长度
int frameLenth = ((int)getbuf[3]) << 8 | (int)getbuf[4];
//4、解析音频名字
char AudioName[128];
int AudioNameLength = 0;
AudioNameLength = frameLenth - 9 - 2;
memcpy(AudioName, getbuf + 9, AudioNameLength);
#if MEGAPHONE_CONFIG_STATUS == VERSION_SWITCH_ON
if (ListBelong == 0)
{
//1、检查歌曲是否存在
ret = AudioFile_CheckFile_WhetherInList(AudioName,AudioNameLength);
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
//回复操作失败
JZsdk_Uart_SendDeal_Reply_Failure(Port, FrameSequence);
return ret;
}
//2、获取歌曲详细信息
struct AudioMange_audio_struct AudioDetailMessage;
ret = AudioFile_GetAudioInfo(AudioName, AudioNameLength,&AudioDetailMessage);
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
//回复操作失败
JZsdk_Uart_SendDeal_Reply_Failure(Port, FrameSequence);
return ret;
}
//获取文件的md5码
unsigned char md5[16];
unsigned char cmd[256];
snprintf(cmd, sizeof(cmd), "md5sum /root/sdcard/audio/%s", AudioDetailMessage.FileName);
JZsdk_RunSystemCmd_ReturnResult_Str(cmd, md5);
//3、发送歌曲详细信息
// JZSDK_LOG_INFO("即将发送%s, %d, %d, %s",
// AudioDetailMessage.FileName, AudioDetailMessage.FileSize, AudioDetailMessage.Time, md5);
//要求所有信息
if (QueryContent == 0)
{
//发送名字
JZsdk_Uart_SendDeal_Send_AudioDetailMessage(Port, FrameSequence, 0x00, AudioDetailMessage.FileName, AudioDetailMessage.FileNameLen);
//文件大小
unsigned char str1[4];
str1[0] = (AudioDetailMessage.FileSize >> 24) & 0xFF;
str1[1] = (AudioDetailMessage.FileSize >> 16) & 0xFF;
str1[2] = (AudioDetailMessage.FileSize >> 8) & 0xFF;
str1[3] = AudioDetailMessage.FileSize & 0xFF;
JZsdk_Uart_SendDeal_Send_AudioDetailMessage(Port, FrameSequence, 0x01, str1, sizeof(str1));
//播放时间
unsigned char str2[4];
str2[0] = (AudioDetailMessage.Time >> 8) & 0xFF;
str2[1] = AudioDetailMessage.Time & 0xFF;
JZsdk_Uart_SendDeal_Send_AudioDetailMessage(Port, FrameSequence, 0x02, str2, sizeof(str2));
}
else if (QueryContent == 0x01)
{
//文件大小
unsigned char str1[4];
str1[0] = (AudioDetailMessage.FileSize >> 24) & 0xFF;
str1[1] = (AudioDetailMessage.FileSize >> 16) & 0xFF;
str1[2] = (AudioDetailMessage.FileSize >> 8) & 0xFF;
str1[3] = AudioDetailMessage.FileSize & 0xFF;
JZsdk_Uart_SendDeal_Send_AudioDetailMessage(Port, FrameSequence, 0x01, str1, sizeof(str1));
}
else if (QueryContent == 0x02)
{
//播放时间
unsigned char str2[4];
str2[0] = (AudioDetailMessage.Time >> 8) & 0xFF;
str2[1] = AudioDetailMessage.Time & 0xFF;
JZsdk_Uart_SendDeal_Send_AudioDetailMessage(Port, FrameSequence, 0x02, str2, sizeof(str2));
}
else if (QueryContent == 0x20)
{
//发送md5码
JZsdk_Uart_SendDeal_Send_AudioDetailMessage(Port, FrameSequence, 0x20, md5, sizeof(md5));
}
}
#endif
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/*********
*
* 强制关闭功放
... ... @@ -1190,6 +1395,30 @@ static int RecvDeal_PlayLoop(int Port, char *getbuf)
/*********
*
* 设置循环时间
*
*
**********/
static int RecvDeal_PlayLoopInterval(int Port, char *getbuf)
{
JZSDK_LOG_INFO("%s,设置循环时间, %d",RecvDeal_GetPortName(Port),getbuf[9]);
//获取帧的序列号
int FrameSequence = JZsdk_Get_FrameSequence(getbuf);
int mode;
int LoopInterval = ((int)getbuf[9] << 8) + (int)getbuf[10];
UIcontrol_Set_AudioPlayLoopInterval(Port, LoopInterval);
//回复操作成功
JZsdk_Uart_SendDeal_Reply_Sucesss(Port, FrameSequence);
}
/*********
*
* 删除音频
*
*
... ... @@ -1539,6 +1768,13 @@ static T_JZsdkReturnCode RecvDeal_OpusTrans_LimitTransmission(int Port, char *ge
{
JZSDK_LOG_INFO("%s,传输opus定长音频文件中",RecvDeal_GetPortName(Port));
if (UartRecvMode != JZ_INSCODE_5AFRAME_OPUS_TRAN_UNLIMIT_TRANSMISSION)
{
JZSDK_LOG_ERROR("不处于opus传输模式,无法接收opus定长音频文件");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
T_JZsdkReturnCode ret;
//提取出数据
... ... @@ -1579,7 +1815,7 @@ static int RecvDeal_OpusTrans_stop(int Port, char *getbuf)
#if MEGAPHONE_CONFIG_STATUS == VERSION_SWITCH_ON
Megaphone_SaveOpusStop();
Megaphone_SaveOpusStop(JZ_FLAGCODE_OFF, NULL);
#endif
JZsdk_Uart_RecvDeal_Set_UartReceiveMode(Port, JZ_INSCODE_5AFRAME_OPUS_TRANS_STOP);
... ... @@ -1589,6 +1825,91 @@ static int RecvDeal_OpusTrans_stop(int Port, char *getbuf)
//回复操作成功
JZsdk_Uart_SendDeal_Reply_Sucesss(Port, FrameSequence);
}
/*********
*
* opus结束传输并校验
*
*
**********/
static int RecvDeal_OpusTrans_stop_and_check(int Port, char *getbuf)
{
T_JZsdkReturnCode ret;
JZSDK_LOG_INFO("%s,传输的opus文件保存并校验",RecvDeal_GetPortName(Port));
//获取帧的序列号
int FrameSequence = JZsdk_Get_FrameSequence(getbuf);
if (UartRecvMode != JZ_INSCODE_5AFRAME_OPUS_TRAN_UNLIMIT_TRANSMISSION)
{
//回复操作失败
JZsdk_Uart_SendDeal_Reply_Failure(Port, FrameSequence);
JZSDK_LOG_ERROR("关闭音频文件上传失败,音频文件上传未开始,无法关闭");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
unsigned char checkCode[128];
int frameLenth = ((int)getbuf[3]) << 8 | (int)getbuf[4];
int CodeLenth = frameLenth - 10 - 2;
if (CodeLenth != 0)
{
memcpy(checkCode, &getbuf[10], CodeLenth);
JZSDK_LOG_INFO("checkCode :%s", checkCode);
}
else
{
JZsdk_Uart_SendDeal_Reply_Failure(Port, FrameSequence);
JZSDK_LOG_ERROR("关闭音频文件上传失败,校验码长度为0");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
//获取校验方式
int checkType = 0;
if (getbuf[9] == 0)
{
checkType = JZSDK_CHECK_SUM_TYPE_MD5;
}
else if (getbuf[9] == 1)
{
checkType = JZSDK_CHECK_SUM_TYPE_SRC32;
}
else
{
checkType = JZSDK_CHECK_SUM_TYPE_MD5;
}
//1、保存音频数据
#if MEGAPHONE_CONFIG_STATUS == VERSION_SWITCH_ON
ret = Megaphone_SaveOpusStop(checkType, checkCode);
if (ret == JZ_ERROR_CHECKCODE_CHECK_ERROR)
{
JZsdk_Uart_SendDeal_Reply_CheckError(Port, FrameSequence);
}
else if (ret == JZ_ERROR_CHECKCODE_DECODE_ERROR)
{
JZsdk_Uart_SendDeal_Reply_DecodeError(Port, FrameSequence);
}
else if (ret == JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
//回复操作成功
JZsdk_Uart_SendDeal_Reply_Sucesss(Port, FrameSequence);
}
else
{
//回复操作失败
JZsdk_Uart_SendDeal_Reply_Failure(Port, FrameSequence);
}
#endif
//3、调整接收模式为音频文件传输
JZsdk_Uart_RecvDeal_Set_UartReceiveMode(Port, JZ_INSCODE_5AFRAME_AUDIOFILE_TRANS_STOP);
}
/*********
*
* opus播放
... ... @@ -2007,11 +2328,11 @@ static int RecvDeal_SearchLight_SubscriptionControl(int Port, char *getbuf)
if (Port == UART_DEV_2)
{
JZsdk_Uart_SendDeal_MessageSubcription_Control(UART_DEV_1, value);
//JZsdk_Uart_SendDeal_MessageSubcription_Control(UART_DEV_1, value);
}
else if (Port == UART_DEV_1)
{
JZsdk_Uart_SendDeal_MessageSubcription_Control(UART_DEV_2, value);
//JZsdk_Uart_SendDeal_MessageSubcription_Control(UART_DEV_2, value);
}
else
{
... ... @@ -3129,6 +3450,12 @@ int RecvDeal_InstructInput(int Port, int Receive_mode, unsigned char *getbuf, in
return 0;
break;
//关闭音频文件上传并校验
case JZ_INSCODE_5AFRAME_AUDIOFILE_TRANS_STOP_AND_CHECK:
RecvDeal_SaveAudioFileTrans_stop_and_check(Port,getbuf);
return 0;
break;
//播放指定音频
case JZ_INSCODE_5AFRAME_AUDIO_PLAYFILE:
RecvDeal_audio_PlayFile(Port,getbuf);
... ... @@ -3237,6 +3564,11 @@ int RecvDeal_InstructInput(int Port, int Receive_mode, unsigned char *getbuf, in
return 0;
break;
//设置循环间隔
case JZ_INSCODE_5AFRAME_CHECKSTATUS_ADUIO_LOOP_INTERVAL:
RecvDeal_PlayLoopInterval(Port,getbuf);
return 0;
break;
//删除音频
case JZ_INSCODE_5AFRAME_DELETE_AUDIO:
... ... @@ -3278,6 +3610,13 @@ int RecvDeal_InstructInput(int Port, int Receive_mode, unsigned char *getbuf, in
RecvDeal_OpusTrans_stop(Port,getbuf);
return 0;
break;
//关闭opus传输并校验
case JZ_INSCODE_5AFRAME_OPUS_TRANS_STOP_AND_CHECK:
RecvDeal_OpusTrans_stop_and_check(Port,getbuf);
return 0;
break;
//播放opus
case JZ_INSCODE_5AFRAME_OPUS_PLAY:
RecvDeal_OpusPlay(Port,getbuf);
... ... @@ -3360,8 +3699,11 @@ int RecvDeal_InstructInput(int Port, int Receive_mode, unsigned char *getbuf, in
RecvDeal_audio_GetMusicList(Port,getbuf);
return 0;
break;
//查询音频详细信息
case JZ_INSCODE_5AFRAME_CHECKSTATUS_AUDIO_DETAIL_MESSAGE:
RecvDeal_CheckStatus_AudioDetailMessage(Port,getbuf);
return 0;
break;
//爆闪频率设置
case JZ_INSCODE_5AFRAME_SEARCHLIGHT_SET_FREQUENCY:
... ...
... ... @@ -193,6 +193,38 @@ int JZsdk_Uart_SendDeal_Reply_Failure(int Uartport ,int FrameSequence)
JZsdk_Uart_UartSend(Uartport ,sendbuf, send_buf_len);
}
//发送校验失败帧
T_JZsdkReturnCode JZsdk_Uart_SendDeal_Reply_CheckError(int Uartport ,int FrameSequence)
{
unsigned char sendbuf[256];
int send_buf_len;
//1、获取帧样板
JZsdk_GetFrameTemplate(JZ_INSCODE_5BFRAME_FILE_CHECK_DEFEAT , sendbuf, &send_buf_len);
//2、写入数据
sendbuf[6] = FrameSequence; //帧序列
//3、发送帧
JZsdk_Uart_UartSend(Uartport ,sendbuf, send_buf_len);
}
//发送解码失败帧
T_JZsdkReturnCode JZsdk_Uart_SendDeal_Reply_DecodeError(int Uartport ,int FrameSequence)
{
unsigned char sendbuf[256];
int send_buf_len;
//1、获取帧样板
JZsdk_GetFrameTemplate(JZ_INSCODE_5BFRAME_FILE_DECODE_DEFEAT , sendbuf, &send_buf_len);
//2、写入数据
sendbuf[6] = FrameSequence; //帧序列
//3、发送帧
JZsdk_Uart_UartSend(Uartport ,sendbuf, send_buf_len);
}
//发送当前从设备名
int JZsdk_Uart_SendDeal_Reply_SecondaryDeviceName(int Uartport , int device_name, int FrameSequence)
{
... ... @@ -390,6 +422,33 @@ T_JZsdkReturnCode JZsdk_Uart_SentDeal_Reply_Musiclist(int UartPort ,int FrameSeq
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
//发送音频详细信息帧
T_JZsdkReturnCode JZsdk_Uart_SendDeal_Send_AudioDetailMessage(int Uartport, int FrameSequence, unsigned char type ,unsigned char *data, unsigned int datalen)
{
printf("发送播放状态结束帧\n");
unsigned char sendbuf[256];
int send_buf_len;
//1、获取帧样板
JZsdk_GetFrameTemplate(JZ_INSCODE_5BFRAME_CHECKSTATUS_AUDIO_DETAIL_MESSAGE , sendbuf, &send_buf_len);
//2、写入数据
send_buf_len = send_buf_len -1 + datalen;
sendbuf[3] = (unsigned char)( (send_buf_len >> 8) & 0xFF); //帧长度
sendbuf[4] = (unsigned char)(send_buf_len & 0xFF); //帧长度
sendbuf[6] = FrameSequence; //帧序列
sendbuf[9] = type;
memcpy(&sendbuf[10],data,datalen);
sendbuf[send_buf_len-2] = 0x00;
sendbuf[send_buf_len-1] = 0x23;
//3、发送帧
JZsdk_Uart_UartSend(Uartport ,sendbuf, send_buf_len);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
//发送播放状态结束帧
int JZsdk_Uart_SendDeal_Send_PlayStatus_end(int Uartport)
{
... ...
... ... @@ -39,8 +39,15 @@ int JZsdk_Uart_SendDeal_QuerySecondaryDeviceName(int Uartport ,int FrameSequence
int JZsdk_Uart_SendDeal_Reply_Sucesss(int Uartport ,int FrameSequence);
T_JZsdkReturnCode JZsdk_Uart_SendDeal_Reply_CheckError(int Uartport ,int FrameSequence);
T_JZsdkReturnCode JZsdk_Uart_SendDeal_Reply_DecodeError(int Uartport ,int FrameSequence);
int JZsdk_Uart_SendDeal_Reply_Failure(int Uartport ,int FrameSequence);
T_JZsdkReturnCode JZsdk_Uart_SentDeal_Reply_Musiclist(int UartPort ,int FrameSequence, int music_sum ,char **MusicName ,int *MusicNameLength);
T_JZsdkReturnCode JZsdk_Uart_SendDeal_Send_AudioDetailMessage(int Uartport,int FrameSequence, unsigned char type ,unsigned char *data, unsigned int datalen);
int JZsdk_Uart_SendDeal_Send_PlayStatus_end(int Uartport);
int JZsdk_Uart_SendDeal_Send_PlayStatus(int Uartport ,int num);
int JZsdk_Uart_SendDeal_Reply_MusicName(int Uartport ,char *music_name, int music_name_len);
... ...
... ... @@ -74,12 +74,20 @@ T_JZsdkReturnCode AudioDeal_Init()
JZSDK_LOG_INFO("MODULE_AUDIODEL_INIT_COMPLETE");
}
T_JZsdkReturnCode AudioDeal_FilterReset(int mode)
/*
设置滤波模式
0x00 默认滤波 0x01 M30滤波
*/
T_JZsdkReturnCode AudioDeal_SetFilterMode(int mode)
{
FF_Filter_Init(AudioDeakInfo_index, mode);
FF_Filter_Set_FilterMode(mode);
}
/******************************
*
* 采样器重初始化
... ... @@ -88,11 +96,9 @@ T_JZsdkReturnCode AudioDeal_FilterReset(int mode)
* *********************************************/
T_JZsdkReturnCode AudioDeal_ResampleRest(unsigned int in_sampleRate, AVChannelLayout in_ch_layout, enum AVSampleFormat in_format)
{
Audiodeal_status = JZ_FLAGCODE_OFF;
FF_Resample_Reset(AudioDeakInfo_index ,in_sampleRate, in_ch_layout, in_format);
Audiodeal_status = JZ_FLAGCODE_ON;
}
/***************************************************************************************************************************************************
... ...
... ... @@ -98,7 +98,7 @@ T_JZsdkReturnCode AudioFile_Stream_DataInput(AVFrame *frame);
T_JZsdkReturnCode AudioDeal_Mp3DataInput(int In_Bitrate, unsigned char *buffer, int bytesRead);
T_JZsdkReturnCode AudioDeal_PauseAndContinuePlay(int status);
T_JZsdkReturnCode Get_AudioDealStatus();
T_JZsdkReturnCode AudioDeal_FilterReset(int mode);
T_JZsdkReturnCode AudioDeal_SetFilterMode(int mode);
#ifdef __cplusplus
}
... ...
... ... @@ -40,6 +40,9 @@ T_JZsdkReturnCode AudioFile_Stream_Interface_PcmData(struct AudioDealInfo *AD_In
//JZSDK_LOG_INFO("滤波已完成");
//检查滤波器
FF_Filter_Init(AD_Info, 0x01);
//滤波
if(AD_Info->FilterMode != JZ_FLAGCODE_OFF)
{
... ...
... ... @@ -82,6 +82,9 @@ T_JZsdkReturnCode mp3_Stream_Interface_Mp3Data(struct AudioDealInfo *AD_Info, un
//重置重采样器
FF_Resample_Reset(AD_Info, in_sampleRate, (AVChannelLayout)AV_CHANNEL_LAYOUT_MONO, AV_SAMPLE_FMT_S16);
//检查滤波器
FF_Filter_Init(AD_Info, 0x01);
//数据指针 往后一个解析长度
//长度指针 减少一个被解析数据的长度
... ...
... ... @@ -37,6 +37,9 @@ int PCM_PooL_Interface_PcmData(struct AudioDealInfo *AD_Info,unsigned int in_sam
//如果此次输入的音频数据不同于采样的当前设置,重设采样
FF_Resample_Reset(AD_Info, in_sampleRate, in_ch_layout, in_format);
//检查滤波器
FF_Filter_Init(AD_Info, 0x00);
int out_nb_samples = 0; //重采样输出的数据长度
int UnDeal_DataSize = dataSize; //未处理的数据长度
... ...
... ... @@ -36,7 +36,10 @@ struct FF_Filter
}FF_Filter;
static int FilterFlag = JZ_FLAGCODE_OFF;
static int g_FilterFlag = JZ_FLAGCODE_ON;
static int FilterParamNumber = 0;
static int g_FilterMode = 0; //滤波模式 0为默认 1为m30
static int g_FilterType = 0; //滤波类型 0为默认
static T_JZsdkReturnCode FF_Filter_ParamInit(struct AudioDealInfo *AD_Info, unsigned char *FilterParam)
{
... ... @@ -278,7 +281,7 @@ T_JZsdkReturnCode FF_Filter_Release(struct AudioDealInfo *AD_Info)
free(FilterInfo);
AD_Info->FilterInfo = NULL;
FilterFlag = JZ_FLAGCODE_OFF;
g_FilterFlag = JZ_FLAGCODE_OFF;
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
... ... @@ -286,14 +289,53 @@ T_JZsdkReturnCode FF_Filter_Release(struct AudioDealInfo *AD_Info)
/***********************
*
* 滤波器初始化
* AudioType: 0x00 文本类型 0x01 音频类型
*
* **************/
T_JZsdkReturnCode FF_Filter_Init(struct AudioDealInfo *AD_Info, int mode)
T_JZsdkReturnCode FF_Filter_Init(struct AudioDealInfo *AD_Info, int AudioType)
{
T_JZsdkReturnCode ret;
//如果已经注册过滤波器
if (FilterFlag == JZ_FLAGCODE_ON)
int NewType = FILTER_NORMAL;
//通过g_FilterMode 与 音频内容 得出滤波类型
if (g_FilterMode == 0x00) //默认滤波
{
//无须管音频类型,直接同一个默认滤波器
NewType = FILTER_NORMAL;
}
else if (g_FilterMode == 0x01) //30M滤波
{
if (AudioType == 0x00) //文本类型
{
NewType = FILTER_NORMAL_M30_TTS;
}
else if (AudioType == 0x01) //音频类型
{
NewType = FILTER_NORMAL_M30_AUDIO;
}
else
{
JZSDK_LOG_ERROR("错误的音频类型");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
}
else
{
JZSDK_LOG_ERROR("错误的滤波模式");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
//如果当前已经初始化的同样的滤波
if (g_FilterType == NewType)
{
//已经为相同的模式初始化过
//printf("已初始化同样的滤波\n");
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
//如果已经注册过滤波器,则释放滤波器
if (g_FilterFlag == JZ_FLAGCODE_ON)
{
ret = FF_Filter_Release(AD_Info);
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
... ... @@ -304,18 +346,23 @@ T_JZsdkReturnCode FF_Filter_Init(struct AudioDealInfo *AD_Info, int mode)
}
//初始化滤波器
if(mode == 0x00)
switch (NewType)
{
ret =FF_Filter_ParamInit(AD_Info, FILTER_PARAM);
case FILTER_NORMAL:
ret = FF_Filter_ParamInit(AD_Info, FILTER_PARAM_NORMAL);
break;
case FILTER_NORMAL_M30_TTS:
ret = FF_Filter_ParamInit(AD_Info, FILTER_PARAM_M30_TTS);
break;
case FILTER_NORMAL_M30_AUDIO:
ret = FF_Filter_ParamInit(AD_Info, FILTER_PARAM_M30_AUDIO);
break;
}
else if (mode == 0x01)
{
ret =FF_Filter_ParamInit(AD_Info, Filter_M30_1);
}
else
{
ret =FF_Filter_ParamInit(AD_Info, FILTER_PARAM);
default:
ret = FF_Filter_ParamInit(AD_Info, FILTER_PARAM_NORMAL);
break;
}
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
... ... @@ -324,9 +371,12 @@ T_JZsdkReturnCode FF_Filter_Init(struct AudioDealInfo *AD_Info, int mode)
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
FilterFlag = JZ_FLAGCODE_ON;
//设置滤波类型
g_FilterType = NewType;
JZSDK_LOG_DEBUG("Filter注册完成\n");
g_FilterFlag = JZ_FLAGCODE_ON;
JZSDK_LOG_DEBUG("Filter注册完成, 当前模式为%d\n", g_FilterType);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
... ... @@ -367,4 +417,10 @@ T_JZsdkReturnCode FF_Filter_get_frame_from_filter(struct AudioDealInfo *AD_Info
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
T_JZsdkReturnCode FF_Filter_Set_FilterMode(int mode)
{
g_FilterMode = mode;
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
\ No newline at end of file
... ...
... ... @@ -17,9 +17,10 @@
#ifdef __cplusplus
extern "C" {
#endif
T_JZsdkReturnCode FF_Filter_Init(struct AudioDealInfo *AD_Info, int mode);
T_JZsdkReturnCode FF_Filter_Init(struct AudioDealInfo *AD_Info, int AudioType);
T_JZsdkReturnCode FF_Filter_push_frame_to_fliter(struct AudioDealInfo *AD_Info ,AVFrame* in_frame);
T_JZsdkReturnCode FF_Filter_get_frame_from_filter(struct AudioDealInfo *AD_Info ,AVFrame* out_frame);
T_JZsdkReturnCode FF_Filter_Set_FilterMode(int mode);
/* Exported constants --------------------------------------------------------*/
/* 常亮定义*/
... ...
... ... @@ -23,193 +23,8 @@ extern "C" {
//流程 先用 acompressor 压缩动态范围 会影响声音大小
#define Filter_No1 "anequalizer=c0 f=2000 w=2000 g=+12 t=2|c1 f=2000 w=2000 g=+12 t=2"
#define Filter_No2 "acompressor=level_in=1.2:mode=downward:threshold=0.2:ratio=3:attack=50:release=300:makeup=1.2:knee=4:link=average:detection=rms:mix=0.8,highpass=f=300:p=2:mix=1,lowpass=f=5000:p=2:mix=1,lowpass=f=6000:p=2:mix=1,anequalizer=c0 f=2300 w=1500 g=+12 t=2|c1 f=2300 w=1500 g=+12 t=2"
/*
-level_in=1.5:设置输入增益为1.5,这通常用于增加输入信号的响度。
-mode=downward:设置压缩器的工作模式为向下压缩,即仅当信号超过阈值时减少增益。
-threshold=0.5:设置阈值,具体单位取决于该工具的实现,但通常与信号电平相关。
-ratio=3:1:设置压缩比为3:1,意味着每增加3dB的输入电平,输出电平仅增加1dB。
-attack=50ms:设置攻击时间为50毫秒,即信号需要超过阈值50毫秒后才开始压缩。
-release=300ms:设置释放时间为300毫秒,即信号需要低于阈值300毫秒后压缩效果才会逐渐减弱。
-makeup=1.2:设置补偿增益为1.2,用于在压缩后增加信号的总体响度。
-knee=4:设置拐点为4,用于在阈值附近平滑地过渡压缩效果。
-link=average:选择使用所有通道的平均电平来影响压缩,而不是仅使用最响的通道。
-detection=rms:选择使用RMS(均方根)检测来确定信号电平,这通常比峰值检测更平滑。
-mix=0.8:设置混合比例为0.8,意味着在输出中80%使用压缩后的信号,20%使用原始信号(这个参数的具体实现可能因工具而异)。
level_in:原信号的输入增益,相当于前置放大器,默认为1,范围[0.015625, 64]
mode:压缩模式,有 upward和downward两种模式, 默认为downward
threshold:如果媒体流信号达到此阈值,会引起增益减少。默认为0.125,范围[0.00097563, 1]
ratio:信号压缩的比例因子,默认为2,范围[1, 20]
attack:信号提升到阈值所用的毫秒数,默认为20,范围[0.01, 2000]
release:信号降低到阈值所用的毫秒数,默认为250,范围[0.01, 9000]
makeup:在处理后,多少信号被放大. 默认为1,范围[1, 64]
knee:增益降低的阶数,默认为2.82843,范围[1, 8]
link:信号衰减的average和maximum两种模式, 默认为average
detection:采用peak峰值信号或rms均方根信号,默认采用更加平滑的rms
mix:输出时使用多少压缩信号, 默认为1,范围[0, 1]
2、acrossfade
*/
/**
*
Attenuate 10 dB at 1000 Hz, with a bandwidth of 200 Hz:
equalizer=f=1000:t=h:width=200:g=-10
Apply 2 dB gain at 1000 Hz with Q 1 and attenuate 5 dB at 100 Hz with Q 2:
equalizer=f=1000:t=q:w=1:g=2,equalizer=f=100:t=q:w=2:g=-5
在您给出的例子中,您正在使用 equalizer 滤镜来调整音频信号的特定频率点。这些命令很可能是为了某种音频处理软件或库(如 FFmpeg 的滤镜系统,尽管 FFmpeg 的标准滤镜中可能没有直接名为 equalizer 的滤镜,但这里我们假设它是一个自定义或第三方滤镜)设计的。
第一个例子
Attenuate 10 dB at 1000 Hz, with a bandwidth of 200 Hz:
equalizer=f=1000:t=h:width=200:g=-10
f=1000 设置滤波器的中心频率为 1000 Hz。
t=h 或 t=Hz(尽管 t=h 可能是一个简写,但通常更明确的是 t=Hz)指定带宽的单位为 Hz。
width=200 设置滤波器的带宽为 200 Hz。
g=-10 设置在中心频率处的增益为 -10 dB,即衰减 10 dB。
第二个例子
Apply 2 dB gain at 1000 Hz with Q 1 and attenuate 5 dB at 100 Hz with Q 2:
equalizer=f=1000:t=q:w=1:g=2,equalizer=f=100:t=q:w=2:g=-5
第一个 equalizer 滤镜设置:
f=1000 设置中心频率为 1000 Hz。
t=q 指定带宽的单位为 Q 因子。
w=1 设置 Q 因子为 1,这会影响滤波器的带宽和尖锐程度。Q 因子越高,带宽越窄,滤波器越尖锐。
g=2 设置在中心频率处的增益为 2 dB。
第二个 equalizer 滤镜设置:
f=100 设置中心频率为 100 Hz。
同样地,t=q 指定带宽的单位为 Q 因子。
w=2 设置 Q 因子为 2,这会影响 100 Hz 处的滤波效果。
g=-5 设置在中心频率处的增益为 -5 dB,即衰减 5 dB。
请注意,这些命令假设了 equalizer 滤镜能够处理多个实例并应用于同一音频流,且每个实例都独立设置其参数。这在许多音频处理软件中是常见的,但在具体实现时可能会有所不同。
此外,如果您的环境不支持直接以这种方式链接多个滤镜实例(例如,在 FFmpeg 中,您可能需要使用分号 ; 而不是逗号 , 来分隔不同的滤镜,或者将滤镜放入单独的链中),您可能需要调整命令格式以符合您所使用的软件或库的语法要求。然而,在您给出的例子中,逗号 , 被用作分隔符,这通常是在某些特定上下文(如某些音频编辑软件的内部命令或脚本)中使用的。
t=h 和t=q的区别是什么 请详细说说
在音频处理或信号处理领域中,t=h 和 t=q 在设置均衡器(equalizer)或滤波器(filter)时代表了不同的带宽(bandwidth)指定方式,它们主要影响滤波器对频率的响应形状和尖锐程度。以下是详细的区别说明:
t=h(或 Hz)
含义:t=h 或 t=Hz 表示带宽(bandwidth)的单位是赫兹(Hz)。在这种情况下,你直接指定了滤波器频率响应曲线在中心频率两侧下降一定幅度(通常是3dB)所覆盖的频率范围。
影响:使用Hz作为带宽单位时,滤波器的形状(如峰形滤波器、带通滤波器或带阻滤波器等)在频率轴上的展宽是固定的,不随中心频率的变化而变化。这有助于精确控制滤波器对特定频率范围的影响。
应用:当你需要精确控制滤波器影响的频率范围时,使用Hz作为带宽单位非常有用。例如,在音频制作中,你可能想要增强或减弱某个特定频率及其附近很小范围内的声音。
t=q(Q-Factor)
含义:t=q 表示带宽的指定方式是使用Q因子(Q-Factor)。Q因子是中心频率与滤波器带宽的比值,它描述了滤波器对中心频率的选择性,即滤波器如何尖锐地聚焦于中心频率。
影响:Q因子越高,滤波器的带宽越窄,滤波器对中心频率的选择性越强,响应曲线越尖锐。相反,Q因子越低,滤波器的带宽越宽,滤波器对中心频率的选择性越弱,响应曲线越平坦。
应用:当你需要创建一个尖锐的滤波器响应,以便仅影响中心频率附近的非常小的频率范围时,使用Q因子作为带宽指定方式非常合适。例如,在电子音乐制作中,你可能想要创建一个非常尖锐的陷波滤波器来去除某个不想要的频率。
总结
t=h(或Hz)和t=q的主要区别在于它们如何指定滤波器的带宽。
使用Hz时,你直接指定了滤波器在频率轴上的展宽。
使用Q因子时,你指定了滤波器对中心频率的选择性,即滤波器的尖锐程度。
选择哪种方式取决于你的具体需求,比如你需要精确控制哪个频率范围或你想要滤波器有多尖锐。
*
*
*/
// ffmpeg -i 人民警察警歌.mp3 -af "equalizer=f=50:t=q:w=2.0:g=-48, equalizer=f=100:t=q:w=2.0:g=-48, \
// equalizer=f=250:t=q:w=2.0:g=-48, equalizer=f=500:t=q:w=2.0:g=-24, \
// equalizer=f=1000:t=q:w=2.0:g=-24, equalizer=f=4000:t=q:w=2.0:g=0, \
// equalizer=f=8000:t=q:w=2.0:g=0, equalizer=f=16000:t=q:w=2.0:g=0, \
// anequalizer=c0 f=250 w=500 g=-48 t=2|c1 f=250 w=500 g=-48 t=2" out1.mp3
//无滤波113 114
//112.6 111.8
#define Filter_No3 "equalizer=f=50:t=q:w=2.0:g=-48, \
equalizer=f=100:t=q:w=2.0:g=-48, \
equalizer=f=250:t=q:w=2.0:g=-48, \
equalizer=f=500:t=q:w=2.0:g=-24, \
equalizer=f=1000:t=q:w=2.0:g=-12, \
equalizer=f=2000:t=q:w=2.0:g=4, \
equalizer=f=4000:t=q:w=2.0:g=0, \
equalizer=f=8000:t=q:w=2.0:g=-12, \
equalizer=f=16000:t=q:w=2.0:g=-24, \
equalizer=f=32000:t=q:w=2.0:g=-48, \
bass=g=-96:f=200:t=q:w=10"
//114 //117 太尖锐了
#define Filter_No4 "equalizer=f=50:t=q:w=2.0:g=-24, \
equalizer=f=100:t=q:w=2.0:g=-12, \
equalizer=f=250:t=q:w=2.0:g=-12, \
equalizer=f=500:t=q:w=2.0:g=-8, \
equalizer=f=1000:t=q:w=2.0:g=4, \
equalizer=f=2000:t=q:w=2.0:g=4, \
equalizer=f=4000:t=q:w=2.0:g=4, \
equalizer=f=8000:t=q:w=2.0:g=0, \
equalizer=f=16000:t=q:w=2.0:g=-6, \
equalizer=f=32000:t=q:w=2.0:g=-24, \
bass=g=-96:f=150:t=q:w=10"
//113 //115 还是尖锐
#define Filter_No5 "equalizer=f=50:t=q:w=2.0:g=-24, \
equalizer=f=100:t=q:w=2.0:g=-8, \
equalizer=f=250:t=q:w=2.0:g=-8, \
equalizer=f=500:t=q:w=2.0:g=-4, \
equalizer=f=1000:t=q:w=2.0:g=4, \
equalizer=f=2000:t=q:w=2.0:g=0, \
equalizer=f=4000:t=q:w=2.0:g=0, \
equalizer=f=8000:t=q:w=2.0:g=0, \
equalizer=f=16000:t=q:w=2.0:g=-6, \
equalizer=f=32000:t=q:w=2.0:g=-24, \
bass=g=-96:f=130:t=q:w=10"
//113 //115 声音效果跟平常差不多
#define Filter_No6 "equalizer=f=50:t=q:w=2.0:g=-24, \
equalizer=f=100:t=q:w=2.0:g=-24, \
equalizer=f=250:t=q:w=2.0:g=-12, \
equalizer=f=500:t=q:w=2.0:g=-12, \
equalizer=f=1000:t=q:w=2.0:g=-6, \
equalizer=f=2000:t=q:w=2.0:g=0, \
equalizer=f=4000:t=q:w=2.0:g=0, \
equalizer=f=8000:t=q:w=2.0:g=0, \
equalizer=f=16000:t=q:w=2.0:g=-6, \
equalizer=f=32000:t=q:w=2.0:g=-24"
//
#define Filter_No7 "equalizer=f=50:t=q:w=2.0:g=-24, \
equalizer=f=100:t=q:w=2.0:g=-24, \
equalizer=f=250:t=q:w=2.0:g=-12, \
equalizer=f=500:t=q:w=2.0:g=-12, \
equalizer=f=1000:t=q:w=2.0:g=-6, \
equalizer=f=2000:t=q:w=2.0:g=0, \
equalizer=f=4000:t=q:w=2.0:g=0, \
equalizer=f=8000:t=q:w=2.0:g=0, \
equalizer=f=16000:t=q:w=2.0:g=-6, \
equalizer=f=32000:t=q:w=2.0:g=-24, \
bass=g=-96:f=50:t=q:w=8"
//650 那段会影响乐器声 1400那段影响人声
#define Filter_No8 "equalizer=f=100:t=h:width=100:g=-48, \
equalizer=f=350:t=h:width=100:g=-36, \
equalizer=f=650:t=h:width=150:g=-12, \
equalizer=f=1400:t=h:width=600:g=0, \
equalizer=f=2500:t=h:width=500:g=0, \
equalizer=f=3500:t=h:width=600:g=0, \
equalizer=f=4500:t=h:width=500:g=+4, \
equalizer=f=5500:t=h:width=500:g=+8, \
equalizer=f=8000:t=h:width=2000:g=+12, \
bass=g=-96:f=50:t=q:w=8"
//11分钟
#define OLD_FILTER "equalizer=f=31:t=q:w=2.0:g=-48, \
equalizer=f=62:t=q:w=2.0:g=-48, \
equalizer=f=125:t=q:w=2.0:g=-48, \
equalizer=f=250:t=q:w=2.0:g=-24, \
equalizer=f=500:t=q:w=2.0:g=-24, \
equalizer=f=1000:t=q:w=2.0:g=-4, \
equalizer=f=2000:t=q:w=2.0:g=0, \
equalizer=f=4000:t=q:w=2.0:g=0, \
equalizer=f=8000:t=q:w=2.0:g=0, \
equalizer=f=16000:t=q:w=2.0:g=0"
//111.0 111.4 保持46度
#define Filter_No9 "equalizer=f=31:t=q:w=2.0:g=-48, \
#define FILTER_FORMAL_1 "equalizer=f=31:t=q:w=2.0:g=-48, \
equalizer=f=62:t=q:w=2.0:g=-48, \
equalizer=f=125:t=q:w=2.0:g=-48, \
equalizer=f=250:t=q:w=2.0:g=-48, \
... ... @@ -220,42 +35,7 @@ t=h(或Hz)和t=q的主要区别在于它们如何指定滤波器的带宽。
equalizer=f=8000:t=q:w=2.0:g=0, \
equalizer=f=16000:t=q:w=2.0:g=0"
/******
*
*
* loudnorm 标准化音量滤波器
* I= 最大响度
* LRA 响度范围 值越小 范围越小
* TP 音量的最大值
*
* 用于将音频都调节到一个音量大小
*
*
* 降低音量的动态范围,用于减少发热
*
* *********/
//旧式机115
/*
2 37
4 39
6 41
8 43
11 45
14 47
17 49
21 50
22 52
25 55
27 54
31 55
40 57
*/
#define Filter_No10 "equalizer=f=31:t=q:w=2.0:g=-48, \
#define FILTER_FORMAL_2 "equalizer=f=31:t=q:w=2.0:g=-48, \
equalizer=f=62:t=q:w=2.0:g=-48, \
equalizer=f=125:t=q:w=2.0:g=-48, \
equalizer=f=250:t=q:w=2.0:g=-32, \
... ... @@ -266,172 +46,7 @@ t=h(或Hz)和t=q的主要区别在于它们如何指定滤波器的带宽。
equalizer=f=8000:t=q:w=2.0:g=0, \
equalizer=f=16000:t=q:w=2.0:g=0"
//半小时49度 但是音量掉到107了
/*
00 35
4 37
8 39
13 41
18 43
27 45
36 47
52 49
60 49
*/
#define Filter_No11 "equalizer=f=31:t=q:w=2.0:g=-48, \
equalizer=f=62:t=q:w=2.0:g=-48, \
equalizer=f=125:t=q:w=2.0:g=-48, \
equalizer=f=250:t=q:w=2.0:g=-32, \
equalizer=f=500:t=q:w=2.0:g=-24, \
equalizer=f=1000:t=q:w=2.0:g=-12, \
equalizer=f=2000:t=q:w=2.0:g=0, \
equalizer=f=4000:t=q:w=2.0:g=-16, \
equalizer=f=8000:t=q:w=2.0:g=-24, \
equalizer=f=16000:t=q:w=2.0:g=-32"
//113.3
#define Filter_No12 "equalizer=f=31:t=q:w=2.0:g=-42, \
equalizer=f=62:t=q:w=2.0:g=-42, \
equalizer=f=125:t=q:w=2.0:g=-42, \
equalizer=f=250:t=q:w=2.0:g=-28, \
equalizer=f=500:t=q:w=2.0:g=-16, \
equalizer=f=1000:t=q:w=2.0:g=0, \
equalizer=f=2000:t=q:w=2.0:g=0, \
equalizer=f=4000:t=q:w=2.0:g=-2, \
equalizer=f=8000:t=q:w=2.0:g=-4, \
equalizer=f=16000:t=q:w=2.0:g=-8"
//115.6 降低两端 提高中段音量
/*
00 35
01 37
03 39
04 41
05 43
06 45
07 47
09 49 发热过于严重
*/
#define Filter_No13 "equalizer=f=31:t=q:w=2.0:g=-48, \
equalizer=f=62:t=q:w=2.0:g=-48, \
equalizer=f=125:t=q:w=2.0:g=-48, \
equalizer=f=250:t=q:w=2.0:g=-32, \
equalizer=f=500:t=q:w=2.0:g=-24, \
equalizer=f=1000:t=q:w=2.0:g=+8, \
equalizer=f=2000:t=q:w=2.0:g=+8, \
equalizer=f=4000:t=q:w=2.0:g=-4, \
equalizer=f=8000:t=q:w=2.0:g=-8, \
equalizer=f=16000:t=q:w=2.0:g=-12"
//111 降低中频 提高低频
#define Filter_No14 "equalizer=f=31:t=q:w=2.0:g=-48, \
equalizer=f=62:t=q:w=2.0:g=-48, \
equalizer=f=125:t=q:w=2.0:g=-48, \
equalizer=f=250:t=q:w=2.0:g=-18, \
equalizer=f=500:t=q:w=2.0:g=-12, \
equalizer=f=1000:t=q:w=2.0:g=-12, \
equalizer=f=2000:t=q:w=2.0:g=-10, \
equalizer=f=4000:t=q:w=2.0:g=-2, \
equalizer=f=8000:t=q:w=2.0:g=-4, \
equalizer=f=16000:t=q:w=2.0:g=-8"
//112.1 14基础上补偿一点中频
#define Filter_No15 "equalizer=f=31:t=q:w=2.0:g=-48, \
equalizer=f=62:t=q:w=2.0:g=-48, \
equalizer=f=125:t=q:w=2.0:g=-48, \
equalizer=f=250:t=q:w=2.0:g=-18, \
equalizer=f=500:t=q:w=2.0:g=-12, \
equalizer=f=1000:t=q:w=2.0:g=-8, \
equalizer=f=2000:t=q:w=2.0:g=-6, \
equalizer=f=4000:t=q:w=2.0:g=-2, \
equalizer=f=8000:t=q:w=2.0:g=-4, \
equalizer=f=16000:t=q:w=2.0:g=-8"
//112.5 15基础上补偿一点低频
#define Filter_No16 "equalizer=f=31:t=q:w=2.0:g=-48, \
equalizer=f=62:t=q:w=2.0:g=-48, \
equalizer=f=125:t=q:w=2.0:g=-32, \
equalizer=f=250:t=q:w=2.0:g=-12, \
equalizer=f=500:t=q:w=2.0:g=-6, \
equalizer=f=1000:t=q:w=2.0:g=-8, \
equalizer=f=2000:t=q:w=2.0:g=-6, \
equalizer=f=4000:t=q:w=2.0:g=-2, \
equalizer=f=8000:t=q:w=2.0:g=-4, \
equalizer=f=16000:t=q:w=2.0:g=-8"
//117 10的基础上,降低中频,补偿高频
#define Filter_No17 "equalizer=f=31:t=q:w=2.0:g=-48, \
equalizer=f=62:t=q:w=2.0:g=-48, \
equalizer=f=125:t=q:w=2.0:g=-48, \
equalizer=f=250:t=q:w=2.0:g=-32, \
equalizer=f=500:t=q:w=2.0:g=-24, \
equalizer=f=1000:t=q:w=2.0:g=-12, \
equalizer=f=2000:t=q:w=2.0:g=-8, \
equalizer=f=4000:t=q:w=2.0:g=+8, \
equalizer=f=8000:t=q:w=2.0:g=+4, \
equalizer=f=16000:t=q:w=2.0:g=+2"
//115 17的基础上,减少中高频补偿
#define Filter_No18 "equalizer=f=31:t=q:w=2.0:g=-48, \
equalizer=f=62:t=q:w=2.0:g=-48, \
equalizer=f=125:t=q:w=2.0:g=-48, \
equalizer=f=250:t=q:w=2.0:g=-32, \
equalizer=f=500:t=q:w=2.0:g=-24, \
equalizer=f=1000:t=q:w=2.0:g=-12, \
equalizer=f=2000:t=q:w=2.0:g=-8, \
equalizer=f=4000:t=q:w=2.0:g=+2, \
equalizer=f=8000:t=q:w=2.0:g=+4, \
equalizer=f=16000:t=q:w=2.0:g=+2"
//114.6 18的基础上,减少中高频补偿
/*
00 35
2 37
6 39
8 41
11 43
14 45
20 47
24 49
30 50
31 49
33 50
39 52
51 54
56 55
57 54
63 54
*/
#define Filter_No19 "equalizer=f=31:t=q:w=2.0:g=-48, \
equalizer=f=62:t=q:w=2.0:g=-48, \
equalizer=f=125:t=q:w=2.0:g=-48, \
equalizer=f=250:t=q:w=2.0:g=-32, \
equalizer=f=500:t=q:w=2.0:g=-24, \
equalizer=f=1000:t=q:w=2.0:g=-12, \
equalizer=f=2000:t=q:w=2.0:g=-8, \
equalizer=f=4000:t=q:w=2.0:g=+1, \
equalizer=f=8000:t=q:w=2.0:g=+2, \
equalizer=f=16000:t=q:w=2.0:g=+2"
// 19的基础上,补偿低频 比10号方案尖一点
/*
0 35
3 37
5 39
7 41
10 43
14 45
18 47
23 49
27 50
34 52
35 50
36 52
42 54
55 55
63 55
*/
#define Filter_No20 "equalizer=f=31:t=q:w=2.0:g=-48, \
#define FILTER_FORMAL_3 "equalizer=f=31:t=q:w=2.0:g=-48, \
equalizer=f=62:t=q:w=2.0:g=-36, \
equalizer=f=125:t=q:w=2.0:g=-30, \
equalizer=f=250:t=q:w=2.0:g=-26, \
... ... @@ -442,48 +57,75 @@ t=h(或Hz)和t=q的主要区别在于它们如何指定滤波器的带宽。
equalizer=f=8000:t=q:w=2.0:g=+2, \
equalizer=f=16000:t=q:w=2.0:g=+2"
// 20的基础上,补偿中低频
/*
0 35
3 37
5 39
7 41
11 43
13 45
14 47
17 49
19 50
20 52
22 50
23 52
26 54
27 55
*/
#define Filter_No21 "equalizer=f=31:t=q:w=2.0:g=-48, \
#define FILTER_FORMAL_1_M30_TTS "equalizer=f=31:t=q:w=2.0:g=-48, \
equalizer=f=62:t=q:w=2.0:g=-36, \
equalizer=f=125:t=q:w=2.0:g=-30, \
equalizer=f=250:t=q:w=2.0:g=-24, \
equalizer=f=500:t=q:w=2.0:g=-16, \
equalizer=f=250:t=q:w=2.0:g=-26, \
equalizer=f=500:t=q:w=2.0:g=-20, \
equalizer=f=1000:t=q:w=2.0:g=-12, \
equalizer=f=2000:t=q:w=2.0:g=-8, \
equalizer=f=4000:t=q:w=2.0:g=+1, \
equalizer=f=8000:t=q:w=2.0:g=+2, \
equalizer=f=16000:t=q:w=2.0:g=+2"
equalizer=f=16000:t=q:w=2.0:g=+2, \
anequalizer=c0 f=3800 w=1200 g=-5 t=0|c1 f=3800 w=1200 g=-10 t=0, \
anequalizer=c0 f=3100 w=600 g=-3 t=0|c1 f=3100 w=600 g=-3 t=0"
#define Filter_M30_1 "equalizer=f=31:t=q:w=2.0:g=-48, \
#define FILTER_FORMAL_1_M30_1 "equalizer=f=31:t=q:w=2.0:g=-48, \
equalizer=f=62:t=q:w=2.0:g=-36, \
equalizer=f=125:t=q:w=2.0:g=-30, \
equalizer=f=250:t=q:w=2.0:g=-24, \
equalizer=f=500:t=q:w=2.0:g=-16, \
equalizer=f=250:t=q:w=2.0:g=-26, \
equalizer=f=500:t=q:w=2.0:g=-20, \
equalizer=f=1000:t=q:w=2.0:g=-12, \
equalizer=f=2000:t=q:w=2.0:g=-8, \
equalizer=f=4000:t=q:w=2.0:g=+1, \
equalizer=f=8000:t=q:w=2.0:g=+4, \
equalizer=f=16000:t=q:w=2.0:g=+3, \
anequalizer=c0 f=4000 w=1400 g=-22 t=0|c1 f=4000 w=1400 g=-22 t=0, \
anequalizer=c0 f=3700 w=1400 g=-22 t=0|c1 f=3700 w=1400 g=-22 t=0"
equalizer=f=8000:t=q:w=2.0:g=+2, \
equalizer=f=16000:t=q:w=2.0:g=+2, \
anequalizer=c0 f=3800 w=1200 g=-22 t=0|c1 f=3800 w=1200 g=-22 t=0, \
anequalizer=c0 f=3100 w=600 g=-16 t=0|c1 f=3100 w=600 g=-16 t=0"
/*00 35
02 37
05 39
09 41
12 43
30 后是54
*/
// #define FILTER_FORMAL_1_M30_2 "anequalizer=c0 f=4000 w=1400 g=-22 t=0|c1 f=4000 w=1400 g=-22 t=0, \
// anequalizer=c0 f=3700 w=1400 g=-22 t=0|c1 f=3700 w=1400 g=-22 t=0"
//"anequalizer=c0 f=4000 w=1400 g=-22 t=0|c1 f=4000 w=1400 g=-22 t=0" "anequalizer=c0 f=5500 w=1400 g=-22 t=0|c1 f=5500 w=1400 g=-22 t=0" 4-7k出问题
// #define Filter_M30_3 "anequalizer=c0 f=4000 w=1400 g=-22 t=0|c1 f=4000 w=1400 g=-22 t=0,
// anequalizer=c0 f=3700 w=1000 g=-22 t=0|c1 f=3700 w=1000 g=-22 t=0" 4-7k出问题
// "anequalizer=c0 f=4000 w=1400 g=-22 t=0|c1 f=4000 w=1400 g=-22 t=0, \
// anequalizer=c0 f=3700 w=1300 g=-22 t=0|c1 f=3700 w=1300 g=-22 t=0"
// "anequalizer=c0 f=4000 w=1400 g=-22 t=0|c1 f=4000 w=1400 g=-22 t=0, \
// anequalizer=c0 f=3100 w=1300 g=-22 t=0|c1 f=3100 w=1300 g=-22 t=0"
// "anequalizer=c0 f=4000 w=1400 g=-22 t=0|c1 f=4000 w=1400 g=-22 t=0, \
// anequalizer=c0 f=3100 w=600 g=-22 t=0|c1 f=3100 w=600 g=-22 t=0"
// "anequalizer=c0 f=4000 w=1400 g=-22 t=0|c1 f=4000 w=1400 g=-22 t=0, \
// anequalizer=c0 f=3100 w=300 g=-22 t=0|c1 f=3100 w=300 g=-22 t=0" 4-7k出问题
#define Filter_M30_3 "anequalizer=c0 f=4000 w=1400 g=-22 t=0|c1 f=4000 w=1400 g=-22 t=0, \
anequalizer=c0 f=3100 w=600 g=-22 t=0|c1 f=3100 w=600 g=-22 t=0"
typedef enum FilterList{
FILTER_NORMAL = 1,
FILTER_NORMAL_M30_AUDIO = 5,
FILTER_NORMAL_M30_TTS = 6,
}FilterList;
#define FILTER_PARAM Filter_No20
#define FILTER_PARAM_NORMAL FILTER_FORMAL_3
#define FILTER_PARAM_M30_TTS FILTER_FORMAL_1_M30_TTS
#define FILTER_PARAM_M30_AUDIO FILTER_FORMAL_1_M30_1
/* Exported types ------------------------------------------------------------*/
... ...
... ... @@ -18,8 +18,186 @@
extern "C" {
#endif
// 比一的发热还高 6分半
#define OLD_FILTER_2 "equalizer=f=31:t=q:w=2.0:g=-48, \
/* Exported constants --------------------------------------------------------*/
/* 常亮定义*/
//流程 先用 acompressor 压缩动态范围 会影响声音大小
#define Filter_No1 "anequalizer=c0 f=2000 w=2000 g=+12 t=2|c1 f=2000 w=2000 g=+12 t=2"
#define Filter_No2 "acompressor=level_in=1.2:mode=downward:threshold=0.2:ratio=3:attack=50:release=300:makeup=1.2:knee=4:link=average:detection=rms:mix=0.8,highpass=f=300:p=2:mix=1,lowpass=f=5000:p=2:mix=1,lowpass=f=6000:p=2:mix=1,anequalizer=c0 f=2300 w=1500 g=+12 t=2|c1 f=2300 w=1500 g=+12 t=2"
/*
-level_in=1.5:设置输入增益为1.5,这通常用于增加输入信号的响度。
-mode=downward:设置压缩器的工作模式为向下压缩,即仅当信号超过阈值时减少增益。
-threshold=0.5:设置阈值,具体单位取决于该工具的实现,但通常与信号电平相关。
-ratio=3:1:设置压缩比为3:1,意味着每增加3dB的输入电平,输出电平仅增加1dB。
-attack=50ms:设置攻击时间为50毫秒,即信号需要超过阈值50毫秒后才开始压缩。
-release=300ms:设置释放时间为300毫秒,即信号需要低于阈值300毫秒后压缩效果才会逐渐减弱。
-makeup=1.2:设置补偿增益为1.2,用于在压缩后增加信号的总体响度。
-knee=4:设置拐点为4,用于在阈值附近平滑地过渡压缩效果。
-link=average:选择使用所有通道的平均电平来影响压缩,而不是仅使用最响的通道。
-detection=rms:选择使用RMS(均方根)检测来确定信号电平,这通常比峰值检测更平滑。
-mix=0.8:设置混合比例为0.8,意味着在输出中80%使用压缩后的信号,20%使用原始信号(这个参数的具体实现可能因工具而异)。
level_in:原信号的输入增益,相当于前置放大器,默认为1,范围[0.015625, 64]
mode:压缩模式,有 upward和downward两种模式, 默认为downward
threshold:如果媒体流信号达到此阈值,会引起增益减少。默认为0.125,范围[0.00097563, 1]
ratio:信号压缩的比例因子,默认为2,范围[1, 20]
attack:信号提升到阈值所用的毫秒数,默认为20,范围[0.01, 2000]
release:信号降低到阈值所用的毫秒数,默认为250,范围[0.01, 9000]
makeup:在处理后,多少信号被放大. 默认为1,范围[1, 64]
knee:增益降低的阶数,默认为2.82843,范围[1, 8]
link:信号衰减的average和maximum两种模式, 默认为average
detection:采用peak峰值信号或rms均方根信号,默认采用更加平滑的rms
mix:输出时使用多少压缩信号, 默认为1,范围[0, 1]
2、acrossfade
*/
/**
*
Attenuate 10 dB at 1000 Hz, with a bandwidth of 200 Hz:
equalizer=f=1000:t=h:width=200:g=-10
Apply 2 dB gain at 1000 Hz with Q 1 and attenuate 5 dB at 100 Hz with Q 2:
equalizer=f=1000:t=q:w=1:g=2,equalizer=f=100:t=q:w=2:g=-5
在您给出的例子中,您正在使用 equalizer 滤镜来调整音频信号的特定频率点。这些命令很可能是为了某种音频处理软件或库(如 FFmpeg 的滤镜系统,尽管 FFmpeg 的标准滤镜中可能没有直接名为 equalizer 的滤镜,但这里我们假设它是一个自定义或第三方滤镜)设计的。
第一个例子
Attenuate 10 dB at 1000 Hz, with a bandwidth of 200 Hz:
equalizer=f=1000:t=h:width=200:g=-10
f=1000 设置滤波器的中心频率为 1000 Hz。
t=h 或 t=Hz(尽管 t=h 可能是一个简写,但通常更明确的是 t=Hz)指定带宽的单位为 Hz。
width=200 设置滤波器的带宽为 200 Hz。
g=-10 设置在中心频率处的增益为 -10 dB,即衰减 10 dB。
第二个例子
Apply 2 dB gain at 1000 Hz with Q 1 and attenuate 5 dB at 100 Hz with Q 2:
equalizer=f=1000:t=q:w=1:g=2,equalizer=f=100:t=q:w=2:g=-5
第一个 equalizer 滤镜设置:
f=1000 设置中心频率为 1000 Hz。
t=q 指定带宽的单位为 Q 因子。
w=1 设置 Q 因子为 1,这会影响滤波器的带宽和尖锐程度。Q 因子越高,带宽越窄,滤波器越尖锐。
g=2 设置在中心频率处的增益为 2 dB。
第二个 equalizer 滤镜设置:
f=100 设置中心频率为 100 Hz。
同样地,t=q 指定带宽的单位为 Q 因子。
w=2 设置 Q 因子为 2,这会影响 100 Hz 处的滤波效果。
g=-5 设置在中心频率处的增益为 -5 dB,即衰减 5 dB。
请注意,这些命令假设了 equalizer 滤镜能够处理多个实例并应用于同一音频流,且每个实例都独立设置其参数。这在许多音频处理软件中是常见的,但在具体实现时可能会有所不同。
此外,如果您的环境不支持直接以这种方式链接多个滤镜实例(例如,在 FFmpeg 中,您可能需要使用分号 ; 而不是逗号 , 来分隔不同的滤镜,或者将滤镜放入单独的链中),您可能需要调整命令格式以符合您所使用的软件或库的语法要求。然而,在您给出的例子中,逗号 , 被用作分隔符,这通常是在某些特定上下文(如某些音频编辑软件的内部命令或脚本)中使用的。
t=h 和t=q的区别是什么 请详细说说
在音频处理或信号处理领域中,t=h 和 t=q 在设置均衡器(equalizer)或滤波器(filter)时代表了不同的带宽(bandwidth)指定方式,它们主要影响滤波器对频率的响应形状和尖锐程度。以下是详细的区别说明:
t=h(或 Hz)
含义:t=h 或 t=Hz 表示带宽(bandwidth)的单位是赫兹(Hz)。在这种情况下,你直接指定了滤波器频率响应曲线在中心频率两侧下降一定幅度(通常是3dB)所覆盖的频率范围。
影响:使用Hz作为带宽单位时,滤波器的形状(如峰形滤波器、带通滤波器或带阻滤波器等)在频率轴上的展宽是固定的,不随中心频率的变化而变化。这有助于精确控制滤波器对特定频率范围的影响。
应用:当你需要精确控制滤波器影响的频率范围时,使用Hz作为带宽单位非常有用。例如,在音频制作中,你可能想要增强或减弱某个特定频率及其附近很小范围内的声音。
t=q(Q-Factor)
含义:t=q 表示带宽的指定方式是使用Q因子(Q-Factor)。Q因子是中心频率与滤波器带宽的比值,它描述了滤波器对中心频率的选择性,即滤波器如何尖锐地聚焦于中心频率。
影响:Q因子越高,滤波器的带宽越窄,滤波器对中心频率的选择性越强,响应曲线越尖锐。相反,Q因子越低,滤波器的带宽越宽,滤波器对中心频率的选择性越弱,响应曲线越平坦。
应用:当你需要创建一个尖锐的滤波器响应,以便仅影响中心频率附近的非常小的频率范围时,使用Q因子作为带宽指定方式非常合适。例如,在电子音乐制作中,你可能想要创建一个非常尖锐的陷波滤波器来去除某个不想要的频率。
总结
t=h(或Hz)和t=q的主要区别在于它们如何指定滤波器的带宽。
使用Hz时,你直接指定了滤波器在频率轴上的展宽。
使用Q因子时,你指定了滤波器对中心频率的选择性,即滤波器的尖锐程度。
选择哪种方式取决于你的具体需求,比如你需要精确控制哪个频率范围或你想要滤波器有多尖锐。
*
*
*/
// ffmpeg -i 人民警察警歌.mp3 -af "equalizer=f=50:t=q:w=2.0:g=-48, equalizer=f=100:t=q:w=2.0:g=-48, \
// equalizer=f=250:t=q:w=2.0:g=-48, equalizer=f=500:t=q:w=2.0:g=-24, \
// equalizer=f=1000:t=q:w=2.0:g=-24, equalizer=f=4000:t=q:w=2.0:g=0, \
// equalizer=f=8000:t=q:w=2.0:g=0, equalizer=f=16000:t=q:w=2.0:g=0, \
// anequalizer=c0 f=250 w=500 g=-48 t=2|c1 f=250 w=500 g=-48 t=2" out1.mp3
//无滤波113 114
//112.6 111.8
#define Filter_No3 "equalizer=f=50:t=q:w=2.0:g=-48, \
equalizer=f=100:t=q:w=2.0:g=-48, \
equalizer=f=250:t=q:w=2.0:g=-48, \
equalizer=f=500:t=q:w=2.0:g=-24, \
equalizer=f=1000:t=q:w=2.0:g=-12, \
equalizer=f=2000:t=q:w=2.0:g=4, \
equalizer=f=4000:t=q:w=2.0:g=0, \
equalizer=f=8000:t=q:w=2.0:g=-12, \
equalizer=f=16000:t=q:w=2.0:g=-24, \
equalizer=f=32000:t=q:w=2.0:g=-48, \
bass=g=-96:f=200:t=q:w=10"
//114 //117 太尖锐了
#define Filter_No4 "equalizer=f=50:t=q:w=2.0:g=-24, \
equalizer=f=100:t=q:w=2.0:g=-12, \
equalizer=f=250:t=q:w=2.0:g=-12, \
equalizer=f=500:t=q:w=2.0:g=-8, \
equalizer=f=1000:t=q:w=2.0:g=4, \
equalizer=f=2000:t=q:w=2.0:g=4, \
equalizer=f=4000:t=q:w=2.0:g=4, \
equalizer=f=8000:t=q:w=2.0:g=0, \
equalizer=f=16000:t=q:w=2.0:g=-6, \
equalizer=f=32000:t=q:w=2.0:g=-24, \
bass=g=-96:f=150:t=q:w=10"
//113 //115 还是尖锐
#define Filter_No5 "equalizer=f=50:t=q:w=2.0:g=-24, \
equalizer=f=100:t=q:w=2.0:g=-8, \
equalizer=f=250:t=q:w=2.0:g=-8, \
equalizer=f=500:t=q:w=2.0:g=-4, \
equalizer=f=1000:t=q:w=2.0:g=4, \
equalizer=f=2000:t=q:w=2.0:g=0, \
equalizer=f=4000:t=q:w=2.0:g=0, \
equalizer=f=8000:t=q:w=2.0:g=0, \
equalizer=f=16000:t=q:w=2.0:g=-6, \
equalizer=f=32000:t=q:w=2.0:g=-24, \
bass=g=-96:f=130:t=q:w=10"
//113 //115 声音效果跟平常差不多
#define Filter_No6 "equalizer=f=50:t=q:w=2.0:g=-24, \
equalizer=f=100:t=q:w=2.0:g=-24, \
equalizer=f=250:t=q:w=2.0:g=-12, \
equalizer=f=500:t=q:w=2.0:g=-12, \
equalizer=f=1000:t=q:w=2.0:g=-6, \
equalizer=f=2000:t=q:w=2.0:g=0, \
equalizer=f=4000:t=q:w=2.0:g=0, \
equalizer=f=8000:t=q:w=2.0:g=0, \
equalizer=f=16000:t=q:w=2.0:g=-6, \
equalizer=f=32000:t=q:w=2.0:g=-24"
//
#define Filter_No7 "equalizer=f=50:t=q:w=2.0:g=-24, \
equalizer=f=100:t=q:w=2.0:g=-24, \
equalizer=f=250:t=q:w=2.0:g=-12, \
equalizer=f=500:t=q:w=2.0:g=-12, \
equalizer=f=1000:t=q:w=2.0:g=-6, \
equalizer=f=2000:t=q:w=2.0:g=0, \
equalizer=f=4000:t=q:w=2.0:g=0, \
equalizer=f=8000:t=q:w=2.0:g=0, \
equalizer=f=16000:t=q:w=2.0:g=-6, \
equalizer=f=32000:t=q:w=2.0:g=-24, \
bass=g=-96:f=50:t=q:w=8"
//650 那段会影响乐器声 1400那段影响人声
#define Filter_No8 "equalizer=f=100:t=h:width=100:g=-48, \
equalizer=f=350:t=h:width=100:g=-36, \
equalizer=f=650:t=h:width=150:g=-12, \
equalizer=f=1400:t=h:width=600:g=0, \
equalizer=f=2500:t=h:width=500:g=0, \
equalizer=f=3500:t=h:width=600:g=0, \
equalizer=f=4500:t=h:width=500:g=+4, \
equalizer=f=5500:t=h:width=500:g=+8, \
equalizer=f=8000:t=h:width=2000:g=+12, \
bass=g=-96:f=50:t=q:w=8"
//11分钟
#define OLD_FILTER "equalizer=f=31:t=q:w=2.0:g=-48, \
equalizer=f=62:t=q:w=2.0:g=-48, \
equalizer=f=125:t=q:w=2.0:g=-48, \
equalizer=f=250:t=q:w=2.0:g=-24, \
... ... @@ -28,20 +206,289 @@ extern "C" {
equalizer=f=2000:t=q:w=2.0:g=0, \
equalizer=f=4000:t=q:w=2.0:g=0, \
equalizer=f=8000:t=q:w=2.0:g=0, \
equalizer=f=16000:t=q:w=2.0:g=0, \
bass=g=-96:f=50:t=q:w=8"
//240 过热
#define OLD_FILTER_3 "equalizer=f=31:t=q:w=2.0:g=-48, \
equalizer=f=16000:t=q:w=2.0:g=0"
//111.0 111.4 保持46度
#define Filter_No9 "equalizer=f=31:t=q:w=2.0:g=-48, \
equalizer=f=62:t=q:w=2.0:g=-48, \
equalizer=f=125:t=q:w=2.0:g=-48, \
equalizer=f=250:t=q:w=2.0:g=-24, \
equalizer=f=250:t=q:w=2.0:g=-48, \
equalizer=f=500:t=q:w=2.0:g=-48, \
equalizer=f=1000:t=q:w=2.0:g=-24, \
equalizer=f=2000:t=q:w=2.0:g=0, \
equalizer=f=4000:t=q:w=2.0:g=0, \
equalizer=f=8000:t=q:w=2.0:g=0, \
equalizer=f=16000:t=q:w=2.0:g=0"
/******
*
*
* loudnorm 标准化音量滤波器
* I= 最大响度
* LRA 响度范围 值越小 范围越小
* TP 音量的最大值
*
* 用于将音频都调节到一个音量大小
*
*
* 降低音量的动态范围,用于减少发热
*
* *********/
//旧式机115
/*
2 37
4 39
6 41
8 43
11 45
14 47
17 49
21 50
22 52
25 55
27 54
31 55
40 57
*/
#define Filter_No10 "equalizer=f=31:t=q:w=2.0:g=-48, \
equalizer=f=62:t=q:w=2.0:g=-48, \
equalizer=f=125:t=q:w=2.0:g=-48, \
equalizer=f=250:t=q:w=2.0:g=-32, \
equalizer=f=500:t=q:w=2.0:g=-24, \
equalizer=f=1000:t=q:w=2.0:g=-4, \
equalizer=f=1000:t=q:w=2.0:g=-12, \
equalizer=f=2000:t=q:w=2.0:g=0, \
equalizer=f=4000:t=q:w=2.0:g=0, \
equalizer=f=8000:t=q:w=2.0:g=0, \
equalizer=f=16000:t=q:w=2.0:g=0, \
bass=g=-96:f=200:t=h:w=10"
equalizer=f=16000:t=q:w=2.0:g=0"
//半小时49度 但是音量掉到107了
/*
00 35
4 37
8 39
13 41
18 43
27 45
36 47
52 49
60 49
*/
#define Filter_No11 "equalizer=f=31:t=q:w=2.0:g=-48, \
equalizer=f=62:t=q:w=2.0:g=-48, \
equalizer=f=125:t=q:w=2.0:g=-48, \
equalizer=f=250:t=q:w=2.0:g=-32, \
equalizer=f=500:t=q:w=2.0:g=-24, \
equalizer=f=1000:t=q:w=2.0:g=-12, \
equalizer=f=2000:t=q:w=2.0:g=0, \
equalizer=f=4000:t=q:w=2.0:g=-16, \
equalizer=f=8000:t=q:w=2.0:g=-24, \
equalizer=f=16000:t=q:w=2.0:g=-32"
//113.3
#define Filter_No12 "equalizer=f=31:t=q:w=2.0:g=-42, \
equalizer=f=62:t=q:w=2.0:g=-42, \
equalizer=f=125:t=q:w=2.0:g=-42, \
equalizer=f=250:t=q:w=2.0:g=-28, \
equalizer=f=500:t=q:w=2.0:g=-16, \
equalizer=f=1000:t=q:w=2.0:g=0, \
equalizer=f=2000:t=q:w=2.0:g=0, \
equalizer=f=4000:t=q:w=2.0:g=-2, \
equalizer=f=8000:t=q:w=2.0:g=-4, \
equalizer=f=16000:t=q:w=2.0:g=-8"
//115.6 降低两端 提高中段音量
/*
00 35
01 37
03 39
04 41
05 43
06 45
07 47
09 49 发热过于严重
*/
#define Filter_No13 "equalizer=f=31:t=q:w=2.0:g=-48, \
equalizer=f=62:t=q:w=2.0:g=-48, \
equalizer=f=125:t=q:w=2.0:g=-48, \
equalizer=f=250:t=q:w=2.0:g=-32, \
equalizer=f=500:t=q:w=2.0:g=-24, \
equalizer=f=1000:t=q:w=2.0:g=+8, \
equalizer=f=2000:t=q:w=2.0:g=+8, \
equalizer=f=4000:t=q:w=2.0:g=-4, \
equalizer=f=8000:t=q:w=2.0:g=-8, \
equalizer=f=16000:t=q:w=2.0:g=-12"
//111 降低中频 提高低频
#define Filter_No14 "equalizer=f=31:t=q:w=2.0:g=-48, \
equalizer=f=62:t=q:w=2.0:g=-48, \
equalizer=f=125:t=q:w=2.0:g=-48, \
equalizer=f=250:t=q:w=2.0:g=-18, \
equalizer=f=500:t=q:w=2.0:g=-12, \
equalizer=f=1000:t=q:w=2.0:g=-12, \
equalizer=f=2000:t=q:w=2.0:g=-10, \
equalizer=f=4000:t=q:w=2.0:g=-2, \
equalizer=f=8000:t=q:w=2.0:g=-4, \
equalizer=f=16000:t=q:w=2.0:g=-8"
//112.1 14基础上补偿一点中频
#define Filter_No15 "equalizer=f=31:t=q:w=2.0:g=-48, \
equalizer=f=62:t=q:w=2.0:g=-48, \
equalizer=f=125:t=q:w=2.0:g=-48, \
equalizer=f=250:t=q:w=2.0:g=-18, \
equalizer=f=500:t=q:w=2.0:g=-12, \
equalizer=f=1000:t=q:w=2.0:g=-8, \
equalizer=f=2000:t=q:w=2.0:g=-6, \
equalizer=f=4000:t=q:w=2.0:g=-2, \
equalizer=f=8000:t=q:w=2.0:g=-4, \
equalizer=f=16000:t=q:w=2.0:g=-8"
//112.5 15基础上补偿一点低频
#define Filter_No16 "equalizer=f=31:t=q:w=2.0:g=-48, \
equalizer=f=62:t=q:w=2.0:g=-48, \
equalizer=f=125:t=q:w=2.0:g=-32, \
equalizer=f=250:t=q:w=2.0:g=-12, \
equalizer=f=500:t=q:w=2.0:g=-6, \
equalizer=f=1000:t=q:w=2.0:g=-8, \
equalizer=f=2000:t=q:w=2.0:g=-6, \
equalizer=f=4000:t=q:w=2.0:g=-2, \
equalizer=f=8000:t=q:w=2.0:g=-4, \
equalizer=f=16000:t=q:w=2.0:g=-8"
//117 10的基础上,降低中频,补偿高频
#define Filter_No17 "equalizer=f=31:t=q:w=2.0:g=-48, \
equalizer=f=62:t=q:w=2.0:g=-48, \
equalizer=f=125:t=q:w=2.0:g=-48, \
equalizer=f=250:t=q:w=2.0:g=-32, \
equalizer=f=500:t=q:w=2.0:g=-24, \
equalizer=f=1000:t=q:w=2.0:g=-12, \
equalizer=f=2000:t=q:w=2.0:g=-8, \
equalizer=f=4000:t=q:w=2.0:g=+8, \
equalizer=f=8000:t=q:w=2.0:g=+4, \
equalizer=f=16000:t=q:w=2.0:g=+2"
//115 17的基础上,减少中高频补偿
#define Filter_No18 "equalizer=f=31:t=q:w=2.0:g=-48, \
equalizer=f=62:t=q:w=2.0:g=-48, \
equalizer=f=125:t=q:w=2.0:g=-48, \
equalizer=f=250:t=q:w=2.0:g=-32, \
equalizer=f=500:t=q:w=2.0:g=-24, \
equalizer=f=1000:t=q:w=2.0:g=-12, \
equalizer=f=2000:t=q:w=2.0:g=-8, \
equalizer=f=4000:t=q:w=2.0:g=+2, \
equalizer=f=8000:t=q:w=2.0:g=+4, \
equalizer=f=16000:t=q:w=2.0:g=+2"
//114.6 18的基础上,减少中高频补偿
/*
00 35
2 37
6 39
8 41
11 43
14 45
20 47
24 49
30 50
31 49
33 50
39 52
51 54
56 55
57 54
63 54
*/
#define Filter_No19 "equalizer=f=31:t=q:w=2.0:g=-48, \
equalizer=f=62:t=q:w=2.0:g=-48, \
equalizer=f=125:t=q:w=2.0:g=-48, \
equalizer=f=250:t=q:w=2.0:g=-32, \
equalizer=f=500:t=q:w=2.0:g=-24, \
equalizer=f=1000:t=q:w=2.0:g=-12, \
equalizer=f=2000:t=q:w=2.0:g=-8, \
equalizer=f=4000:t=q:w=2.0:g=+1, \
equalizer=f=8000:t=q:w=2.0:g=+2, \
equalizer=f=16000:t=q:w=2.0:g=+2"
// 19的基础上,补偿低频 比10号方案尖一点
/*
0 35
3 37
5 39
7 41
10 43
14 45
18 47
23 49
27 50
34 52
35 50
36 52
42 54
55 55
63 55
*/
#define Filter_No20 "equalizer=f=31:t=q:w=2.0:g=-48, \
equalizer=f=62:t=q:w=2.0:g=-36, \
equalizer=f=125:t=q:w=2.0:g=-30, \
equalizer=f=250:t=q:w=2.0:g=-26, \
equalizer=f=500:t=q:w=2.0:g=-20, \
equalizer=f=1000:t=q:w=2.0:g=-12, \
equalizer=f=2000:t=q:w=2.0:g=-8, \
equalizer=f=4000:t=q:w=2.0:g=+1, \
equalizer=f=8000:t=q:w=2.0:g=+2, \
equalizer=f=16000:t=q:w=2.0:g=+2"
// 20的基础上,补偿中低频
/*
0 35
3 37
5 39
7 41
11 43
13 45
14 47
17 49
19 50
20 52
22 50
23 52
26 54
27 55
*/
#define Filter_No21 "equalizer=f=31:t=q:w=2.0:g=-48, \
equalizer=f=62:t=q:w=2.0:g=-36, \
equalizer=f=125:t=q:w=2.0:g=-30, \
equalizer=f=250:t=q:w=2.0:g=-24, \
equalizer=f=500:t=q:w=2.0:g=-16, \
equalizer=f=1000:t=q:w=2.0:g=-12, \
equalizer=f=2000:t=q:w=2.0:g=-8, \
equalizer=f=4000:t=q:w=2.0:g=+1, \
equalizer=f=8000:t=q:w=2.0:g=+2, \
equalizer=f=16000:t=q:w=2.0:g=+2"
#define Filter_M30_1 "equalizer=f=31:t=q:w=2.0:g=-48, \
equalizer=f=62:t=q:w=2.0:g=-36, \
equalizer=f=125:t=q:w=2.0:g=-30, \
equalizer=f=250:t=q:w=2.0:g=-24, \
equalizer=f=500:t=q:w=2.0:g=-16, \
equalizer=f=1000:t=q:w=2.0:g=-12, \
equalizer=f=2000:t=q:w=2.0:g=-8, \
equalizer=f=4000:t=q:w=2.0:g=+1, \
equalizer=f=8000:t=q:w=2.0:g=+4, \
equalizer=f=16000:t=q:w=2.0:g=+3, \
anequalizer=c0 f=4000 w=1400 g=-22 t=0|c1 f=4000 w=1400 g=-22 t=0, \
anequalizer=c0 f=3700 w=1400 g=-22 t=0|c1 f=3700 w=1400 g=-22 t=0"
#define Filter_M30_2 "anequalizer=c0 f=4000 w=1400 g=-22 t=0|c1 f=4000 w=1400 g=-22 t=0, \
anequalizer=c0 f=3700 w=1400 g=-22 t=0|c1 f=3700 w=1400 g=-22 t=0"
#define Filter_M30_3 "anequalizer=c0 f=4000 w=1400 g=-22 t=0|c1 f=4000 w=1400 g=-22 t=0"
#define FILTER_PARAM Filter_No20
/* Exported types ------------------------------------------------------------*/
... ...
... ... @@ -265,7 +265,6 @@ static T_JZsdkReturnCode DeviceMessage_Enter_Debug(unsigned char *message)
snprintf(message,MESSAGE_MAX_LEN,"%s%s",old_message,new_message);
}
#if MEGAPHONE_CONFIG_STATUS == VERSION_SWITCH_ON
memset(new_message,0,sizeof(new_message));
memset(old_message,0,sizeof(old_message));
... ... @@ -284,6 +283,9 @@ static T_JZsdkReturnCode DeviceMessage_Enter_Debug(unsigned char *message)
snprintf(message,MESSAGE_MAX_LEN,"%s%s",old_message,new_message);
}
#endif
}
... ...
... ... @@ -27,8 +27,10 @@ T_JZsdkReturnCode FOMAT_Get_FirewareOriginRegion();
typedef enum OriginRegionPlace
{
ORIGIN_DEFAULT = 0x0000,
ORIGIN_CN = 0x0001,
ORIGIN_EN = 0x0002,
ORIGIN_CN = 0x0001, //中区码
ORIGIN_EN = 0x0002, //英区码
ORIGIN_NA = 0x0003, //南美码
ORIGIN_EU = 0x0004, //欧洲码
}OriginRegionPlace;
/* Exported functions --------------------------------------------------------*/
... ...
... ... @@ -10,6 +10,7 @@
#include <stdio.h>
#include <pthread.h>
#include <math.h>
#include <stdlib.h>
#include "JZsdkLib.h"
#include "Gimbal/Gimbal_Param.h"
#include "Gimbal/Gimbal.h"
... ... @@ -19,7 +20,6 @@
#include "BaseConfig.h"
//数值角度记录
static int Gimbal_PitchAngle = 0; //俯仰角度 //控制云台上相机相对于水平面的上下移动。
static int Gimbal_YawAngle = 0; //偏航角度 //个角度控制云台上相机相对于水平面的上下移动。
... ... @@ -245,6 +245,17 @@ T_JZsdkReturnCode Gimbal_Set_PitchFineTuning(int pitch)
#if DEVICE_VERSION == JZ_H1T
JZsdk_Uart_Send_SetGimbalFineTuningPitch(UART_DEV_1, g_MotorFineTuningPitch);
#else
//微调值要小于20度
if (g_MotorFineTuningPitch >= 200)
{
g_MotorFineTuningPitch = 200;
}
if (g_MotorFineTuningPitch <= -200)
{
g_MotorFineTuningPitch = -200;
}
//存储到文件
MotorFineTuning_WritePitch(g_MotorFineTuningPitch);
#endif
... ...
... ... @@ -26,6 +26,10 @@ extern "C" {
/* Exported functions --------------------------------------------------------*/
#if DEVICE_VERSION == JZ_C1
#define PITCH_PWM_MAX 0
#define PITCH_PWM_MIN 0
#define MAX_PITCH 0
#define MIN_PITCH 0
#elif DEVICE_VERSION == JZ_H150S || DEVICE_VERSION == JZ_H150T
... ...
... ... @@ -80,6 +80,7 @@ static int JZsdk_SearchLightGetLimitTemp(int DeviceMode)
case JZ_U3S:
return 70;
break;
case JZ_U3D:
return 70;
break;
... ...
... ... @@ -134,6 +134,9 @@ static void *TempControl_TempTask(void *arg)
//控件控制初始化
T_JZsdkReturnCode JZsdk_SearchLightTemControl_Init()
{
#if DEVICE_VERSION == JZ_H1T
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
#endif
pthread_t WriteDataTask;
pthread_attr_t task_attribute; //线程属性
... ...
... ... @@ -10,13 +10,13 @@
#include "BaseConfig.h"
#include "./Kt_Irc/Kt_Irc.h"
#include "../ImageProc/PseudoColor/PseudoColor.h"
#include "MediaProc/MediaProc_Param.h"
#include "MediaProc/IRC_funtion/IRC_funtion.h"
static int PseudoColor = JZ_FLAGCODE_OFF; //伪彩颜色
static int PixelColorMode = JZ_FLAGCODE_OFF; //像素颜色模式
int JZsdk_RawBadPixelCheck_Flag = JZ_FLAGCODE_OFF; //原始盲点记录标志
int JZsdk_GrayBadPixelCheck_flag = JZ_FLAGCODE_OFF; //灰度图坏点纠正标志
int JZsdk_SPCCheck_flag = JZ_FLAGCODE_OFF; // 单点纠正标志
int JZsdk_GasEnhancementCorrect_flag = JZ_FLAGCODE_ON; //气体增强纠正标志
static int g_CameraCorrectionMode = JZ_FLAGCODE_OFF; //相机校正模式
static int g_CameraGasEnhancementColor = 0; //默认红0 绿1 蓝2
... ... @@ -52,10 +52,10 @@ T_JZsdkReturnCode JZsdk_Camera_ShutterSwitch(int value)
*
*
* **************************/
T_JZsdkReturnCode JZsdk_Camera_BadPixelSwitch(int value)
T_JZsdkReturnCode JZsdk_Camera_BadPixelSwitch()
{
JZsdk_RawBadPixelCheck_Flag = value; //原始盲点记录标志
JZsdk_GrayBadPixelCheck_flag = value; //灰度图坏点纠正标志
IRC_SetRawPixel_ResetFlag();
IRC_SetGrayPixel_ResetFlag();
}
//单点纠正开关
... ... @@ -65,9 +65,9 @@ T_JZsdkReturnCode JZsdk_Camera_BadPixelSwitch(int value)
*
*
* **************************/
T_JZsdkReturnCode JZsdk_CameraSPC_ResetSwitch(int value)
T_JZsdkReturnCode JZsdk_CameraSPC_ResetSwitch()
{
JZsdk_SPCCheck_flag = value; //单点纠正标志
IRC_SetSPC_ResetFlag();
}
//气体纠正开关
... ... @@ -77,12 +77,9 @@ T_JZsdkReturnCode JZsdk_CameraSPC_ResetSwitch(int value)
*
*
* **************************/
T_JZsdkReturnCode JZsdk_Camera_GasEnhancementCorrectSwitch(int value)
T_JZsdkReturnCode JZsdk_Camera_GasEnhancementCorrectSwitch()
{
value = JZ_FLAGCODE_ON;
JZsdk_GasEnhancementCorrect_flag = value;
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
IRC_SetDGCE_ResetFlag();
}
/********************
... ... @@ -113,18 +110,25 @@ T_JZsdkReturnCode Camera_RegionBox(unsigned int PointX, unsigned int PointY)
{
g_CameraRegionBox_FirstPixel[0] = PointX;
g_CameraRegionBox_FirstPixel[1] = PointY;
IRC_Set_RegionBox(0, PointX, PointY);
IRC_Set_RegionMode(1);
}
else if (g_CameraRegionBox_ClickTime+1 == 2)
{
g_CameraRegionBox_SecondPixel[0] = PointX;
g_CameraRegionBox_SecondPixel[1] = PointY;
IRC_Set_RegionBox(1, PointX, PointY);
IRC_Set_RegionMode(2);
}
g_CameraRegionBox_ClickTime++;
if (g_CameraRegionBox_ClickTime == 3)
{
g_CameraRegionBox_ClickTime=0;
IRC_Set_RegionMode(0);
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
... ... @@ -139,7 +143,7 @@ T_JZsdkReturnCode Camera_RegionBox(unsigned int PointX, unsigned int PointY)
static T_JZsdkReturnCode Camera_CorrectionMode(int mode)
{
g_CameraCorrectionMode = mode;
#if DEVICE_VERSION == JZ_C1
int RealMode = 0;
switch (mode)
... ... @@ -149,11 +153,11 @@ static T_JZsdkReturnCode Camera_CorrectionMode(int mode)
break;
case 1:
RealMode = CAMERA_CORRCTION_SPC;
RealMode = IRC_CORRCTION_SPC;
break;
case 2:
RealMode = CAMERA_CORRCTION_TPC;
RealMode = IRC_CORRCTION_TPC;
break;
default:
... ... @@ -162,7 +166,7 @@ static T_JZsdkReturnCode Camera_CorrectionMode(int mode)
}
//设置相机的当前纠正模式
Kt_Irc_Set_CorrectionMode(RealMode);
IRC_Set_CorrectionMode(RealMode);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
#endif
... ... @@ -177,30 +181,30 @@ static T_JZsdkReturnCode Camera_CorrectionMode(int mode)
* ******************/
static T_JZsdkReturnCode Camera_GasEnhancementColor(int mode)
{
g_CameraCorrectionMode = mode;
#if DEVICE_VERSION == JZ_C1
int RealMode = 0;
switch (mode)
{
case 0:
RealMode = CAMERA_GAS_ENHANCEMENT_RED;
RealMode = IRC_GAS_ENHANCEMENT_RED;
break;
case 1:
RealMode = CAMERA_GAS_ENHANCEMENT_GREEN;
RealMode = IRC_GAS_ENHANCEMENT_GREEN;
break;
case 2:
RealMode = CAMERA_GAS_ENHANCEMENT_BLUE;
RealMode = IRC_GAS_ENHANCEMENT_BLUE;
break;
default:
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
break;
}
g_CameraGasEnhancementColor = mode;
Kt_Irc_Set_GasEnhancementColor(RealMode);
IRC_Set_GasEnhancementColor(RealMode);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
#endif
... ... @@ -280,7 +284,7 @@ T_JZsdkReturnCode Camera_param(int flagcode, enum CameraParam paramflag, int *va
case CAMERA_PIXEL_PSEUDO_COLOR_MODE:
{
ret = Kt_Irc_Set_OutputPixelColorMode(*value);
ret = IRC_Set_OutputPixelColorMode(*value);
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
... ...
... ... @@ -12,7 +12,7 @@
/* Includes ------------------------------------------------------------------*/
#include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
#include "Kt_Irc/Kt_Irc.h"
#include "MediaProc/MediaProc_Param.h"
#ifdef __cplusplus
extern "C" {
... ... @@ -25,36 +25,13 @@ extern "C" {
/* Exported types ------------------------------------------------------------*/
typedef enum CameraParam
{
CAMERA_PSEUDO_COLOR = 0x000001,
CAMERA_PIXEL_PSEUDO_COLOR_MODE = 0x000002,
CAMERA_REGION_BOX = 0x000003,
CAMERA_CORRCTION_MODE = 0x000004,
CAMERA_GAS_ENHANCEMENT_COLOR = 0x000005,
CAMERA_GAS_ENHANCEMENT_CORRCTION = 0x000006,
}CameraParam;
typedef enum CameraCorrectionMode
{
CAMERA_CORRCTION_SPC = 0x000001, //单点纠正
CAMERA_CORRCTION_TPC = 0x000002, //两点纠正
}CameraCorrectionMode;
typedef enum GasEnhancementColor
{
CAMERA_GAS_ENHANCEMENT_RED = 0x000000, //红
CAMERA_GAS_ENHANCEMENT_GREEN = 0x000001, //绿
CAMERA_GAS_ENHANCEMENT_BLUE = 0x000002, //蓝
}GasEnhancementColor;
/* Exported functions --------------------------------------------------------*/
T_JZsdkReturnCode JZsdk_Camera_ShutterSwitch(int value);
T_JZsdkReturnCode Camera_param(int flagcode, enum CameraParam paramflag, int *value);
T_JZsdkReturnCode JZsdk_Camera_BadPixelSwitch(int value);
T_JZsdkReturnCode JZsdk_CameraSPC_ResetSwitch(int value);
T_JZsdkReturnCode JZsdk_Camera_BadPixelSwitch();
T_JZsdkReturnCode JZsdk_CameraSPC_ResetSwitch();
T_JZsdkReturnCode JZsdk_Camera_GasEnhancementCorrectSwitch();
T_JZsdkReturnCode JZsdk_H150ST_CameraInit(int width, int height, int frame_num);
#ifdef __cplusplus
... ...
... ... @@ -12,7 +12,6 @@
#include "JZsdk_usb_bulk/JZsdk_usb_bulk.h"
#include "../V4L2_camera/V4L2_Record.h"
#include "../../StreamProc/StreamProc.h"
#include "./Kt_Irc_deal.h"
#include "../../MediaParm.h"
#include "../../VideoMgmt/VideoMgmt.h"
#include "../../StreamProc/StreamProc.h"
... ... @@ -20,6 +19,8 @@
#include "../Camera.h"
#include "UI_control/UI_control.h"
#include "../../IRC_funtion/IRC_Param.h"
#include "../../IRC_funtion/IRC_funtion.h"
#define IRC_WIDTH FIRST_WIDTH
#define IRC_HEIGHT FIRST_HEIGHT
... ... @@ -27,112 +28,32 @@
#define CAMERA_WIDTH SECOND_WIDTH
#define CAMERA_HEIGHT SECOND_HEIGHT
// 定义帧头长度和帧头内容
//#define FRAME_HEADER_SIZE 6
#define FRAME_HEADER_SIZE 4
//const unsigned char FRAME_HEADER[FRAME_HEADER_SIZE] = {0xaa, 0xbb, 0x02, 0x80, 0x01, 0x00};
const unsigned char FRAME_HEADER[FRAME_HEADER_SIZE] = {0xaa, 0xbb, 0xcc, 0xdd};
static void *Irc_usb_index = NULL;
static int Kt_Camera_fd;
static Kt_Irc_deal *Kt_Irc_deal_cfg = NULL;
extern IRC_param *g_IRC_Param;
//红外数据纠正函数, 暂定全部替换
static T_JZsdkReturnCode Kt_Irc_DataCorrect(unsigned char *data, unsigned int len, unsigned char *BaseBuffer)
{
int fallback_flag = JZ_FLAGCODE_OFF;
int fallback_num = JZ_FLAGCODE_OFF; //纠正的行数
//像素检查+ 像素修正
for (int i = 0; i < IRC_HEIGHT; i++)
{
int index = 640*i;
#define IRC_WIDTH FIRST_WIDTH
#define IRC_HEIGHT FIRST_HEIGHT
//数据检查
if (data[index+6] != i)
{
printf("数据检查不通过\n");
fallback_flag = JZ_FLAGCODE_ON;
fallback_num = i;
break;
}
// 定义帧头长度和帧头内容
#define FRAME_HEADER_SIZE 4
//像素修正
data[index+0] = data[index+8];
data[index+1] = data[index+9];
data[index+2] = data[index+8];
data[index+3] = data[index+9];
data[index+4] = data[index+8];
data[index+5] = data[index+9];
data[index+6] = data[index+8];
data[index+7] = data[index+9];
}
static const unsigned char FRAME_HEADER[FRAME_HEADER_SIZE] = {0xaa, 0xbb, 0xcc, 0xdd};
if (fallback_flag == JZ_FLAGCODE_ON)
{
memcpy(&data[fallback_num*640], &BaseBuffer[fallback_num*640], (len-(fallback_num*640))); //使用回退帧替换该帧
}
else
{
memcpy(BaseBuffer, data, len); //刷新回退帧
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
static void *Irc_usb_index = NULL;
//红外数据的处理
static void *JZsdk_Kt_Irc_DataDeal_Thread(void *args)
//红外数据纠正函数, 暂定全部替换
T_JZsdkReturnCode Kt_Irc_DataCorrect(unsigned char *data)
{
int DealFrameNum = 0;
unsigned char BaseBuffer[IRC_WIDTH*2*IRC_HEIGHT];
while (1)
{
unsigned char *gary_data = NULL;
unsigned int gary_data_len;
//1、从原始流缓冲区中取出raw数据
VideoMgmt_read_data(&VideoMgmt_FirstRaw_index, &gary_data, &gary_data_len,JZ_FLAGCODE_OFF ,JZ_FLAGCODE_OFF);
//2、红外数据纠正处理,该步暂时没必要了
//Kt_Irc_DataCorrect(raw_data, raw_data_len, BaseBuffer);
//3、将灰度图数据转换为原始码流数据
unsigned char *raw_data = NULL;
int raw_data_len = 0;
//Kt_Irc_14bitGrayData_to_RawData(gary_data, gary_data_len, &raw_data, &raw_data_len, Kt_Irc_deal_cfg, 1);
Kt_Irc_14bitGrayData_to_RawData(gary_data, gary_data_len, &raw_data, &raw_data_len, Kt_Irc_deal_cfg, 0);
//4、将原始码流数据转换成h264流,为避免多次复制,这里的h264会直接放入视频流管理的缓冲区
JZsdk_RTKMMP_RawData_to_h264(raw_data, raw_data_len);
free(raw_data);
raw_data = NULL;
free(gary_data);
gary_data = NULL;
//JZSDK_LOG_INFO("得到了一帧红外h264");
}
//像素修正
data[0] = data[5];
data[1] = data[6];
data[2] = data[5];
data[3] = data[6];
}
//红外相机数据的处理线程
static T_JZsdkReturnCode JZsdk_Kt_Irc_DataDeal_Init()
{
pthread_t ReadDataTask;
pthread_attr_t task_attribute; //线程属性
pthread_attr_init(&task_attribute); //初始化线程属性
pthread_attr_setdetachstate(&task_attribute, PTHREAD_CREATE_DETACHED); //设置线程分离属性
int opus_Protection = pthread_create(&ReadDataTask,&task_attribute,JZsdk_Kt_Irc_DataDeal_Thread,NULL); //线程
if(opus_Protection != 0)
{
JZSDK_LOG_ERROR("创建红外相机数据的处理线程失败!");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
//红外数据接收线程
static void *JZsdk_Kt_Irc_DataRecv_Thread(void *args)
... ... @@ -266,7 +187,7 @@ static void *JZsdk_Kt_Irc_DataRecv_Thread(void *args)
}
//红外相机数据的初始化
static T_JZsdkReturnCode JZsdk_Kt_Irc_Data_Init()
T_JZsdkReturnCode JZsdk_Kt_Irc_Data_Init()
{
T_JZsdkReturnCode ret;
... ... @@ -292,6 +213,57 @@ static T_JZsdkReturnCode JZsdk_Kt_Irc_Data_Init()
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
//红外数据的处理
static void *JZsdk_Kt_Irc_DataDeal_Thread(void *args)
{
int DealFrameNum = 0;
unsigned char BaseBuffer[IRC_WIDTH*2*IRC_HEIGHT];
while (1)
{
unsigned char *gary_data = NULL;
unsigned int gary_data_len;
//1、从原始流缓冲区中取出raw数据
VideoMgmt_read_data(&VideoMgmt_FirstRaw_index, &gary_data, &gary_data_len,JZ_FLAGCODE_OFF ,JZ_FLAGCODE_OFF);
//2、红外数据纠正处理
Kt_Irc_DataCorrect(gary_data);
//3、将灰度图数据转换为原始码流数据
unsigned char *raw_data = NULL;
int raw_data_len = 0;
IRC_FrameDeal(gary_data, gary_data_len, &raw_data, &raw_data_len);
//4、将原始码流数据转换成h264流,为避免多次复制,这里的h264会直接放入视频流管理的缓冲区
JZsdk_RTKMMP_RawData_to_h264(raw_data, raw_data_len);
free(raw_data);
raw_data = NULL;
free(gary_data);
gary_data = NULL;
//JZSDK_LOG_DEBUG("得到了一帧红外h264");
}
}
//红外相机数据的处理线程
static T_JZsdkReturnCode JZsdk_Kt_Irc_DataDeal_Init()
{
pthread_t ReadDataTask;
pthread_attr_t task_attribute; //线程属性
pthread_attr_init(&task_attribute); //初始化线程属性
pthread_attr_setdetachstate(&task_attribute, PTHREAD_CREATE_DETACHED); //设置线程分离属性
int opus_Protection = pthread_create(&ReadDataTask,&task_attribute,JZsdk_Kt_Irc_DataDeal_Thread,NULL); //线程
if(opus_Protection != 0)
{
JZSDK_LOG_ERROR("创建红外相机数据的处理线程失败!");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
//光学相机数据的处理线程
static void *JZsdk_Kt_Cam_DataDeal_Thread(void *args)
{
... ... @@ -404,7 +376,7 @@ T_JZsdkReturnCode JZsdk_Kt_Irc_Camera_Init()
}
//2、初始化红外的数据处理
ret = Kt_Irc_deal_Init(&Kt_Irc_deal_cfg, IRC_HEIGHT, IRC_WIDTH);
ret = IRC_ParamInit(&g_IRC_Param, IRC_HEIGHT, IRC_WIDTH, 25);
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
JZSDK_LOG_ERROR("初始化红外的数据处理失败");
... ... @@ -453,136 +425,3 @@ T_JZsdkReturnCode JZsdk_Kt_Irc_ShutterSwitch(int value)
return ret;
}
/***********************************
*
* 昆腾的红外相机的像素输出模式修改
*
* ***************************************/
T_JZsdkReturnCode Kt_Irc_Set_OutputPixelColorMode(int value)
{
T_JZsdkReturnCode ret;
if (value < 0 || value > 2)
{
JZSDK_LOG_ERROR("像素输出模式出错1");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
if (Kt_Irc_deal_cfg == NULL)
{
JZSDK_LOG_ERROR("像素输出模式出错2");
return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
//检查当前模式是否处于单点纠正模式
if (Kt_Irc_deal_cfg->TPC_flag != JZ_FLAGCODE_ON)
{
//设置单点纠正模式
UIcontrol_CameraCorrectionMode(NO_SPECIFIED, CAMERA_CORRCTION_SPC);
}
Kt_Irc_deal_cfg->OutputPixelColorMode = value;
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/***********************************
*
* 昆腾的红外相机的纠正模式修改
*
* ***************************************/
T_JZsdkReturnCode Kt_Irc_Set_CorrectionMode(int mode)
{
if (Kt_Irc_deal_cfg == NULL)
{
JZSDK_LOG_ERROR("纠正模式修改出错");
return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
//关闭纠正
if (mode == JZ_FLAGCODE_OFF)
{
Kt_Irc_deal_cfg->SPC_flag = JZ_FLAGCODE_OFF;
Kt_Irc_deal_cfg->TPC_flag = JZ_FLAGCODE_OFF;
}
else if (mode == CAMERA_CORRCTION_SPC)
{
Kt_Irc_deal_cfg->TPC_flag = JZ_FLAGCODE_OFF;
Kt_Irc_deal_cfg->SPC_flag = JZ_FLAGCODE_ON;
}
else if (mode == CAMERA_CORRCTION_TPC)
{
Kt_Irc_deal_cfg->SPC_flag = JZ_FLAGCODE_OFF;
Kt_Irc_deal_cfg->TPC_flag = JZ_FLAGCODE_ON;
}
else
{
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/***********************************
*
* 昆腾的红外相机的气体增强模式颜色
*
* ***************************************/
T_JZsdkReturnCode Kt_Irc_Set_GasEnhancementColor(int mode)
{
if (Kt_Irc_deal_cfg == NULL)
{
JZSDK_LOG_ERROR("气体增强模式颜色出错");
return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
//关闭纠正
if (mode == CAMERA_GAS_ENHANCEMENT_RED)
{
Kt_Irc_deal_cfg->DGCE_ColorType = CAMERA_GAS_ENHANCEMENT_RED;
}
else if (mode == CAMERA_GAS_ENHANCEMENT_GREEN)
{
Kt_Irc_deal_cfg->DGCE_ColorType = CAMERA_GAS_ENHANCEMENT_GREEN;
}
else if (mode == CAMERA_GAS_ENHANCEMENT_BLUE)
{
Kt_Irc_deal_cfg->DGCE_ColorType = CAMERA_GAS_ENHANCEMENT_BLUE;
}
else
{
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/**********************
*
* 设置高低温标定
* 0为高 1为低
*
* *****************************/
T_JZsdkReturnCode LowAndHigh_Mark(int mode)
{
if (Kt_Irc_deal_cfg == NULL)
{
JZSDK_LOG_ERROR("高低温标定出错");
return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
if (mode == 0)
{
JZSDK_LOG_INFO("高温标定");
Kt_Irc_deal_cfg->HighT_flag = JZ_FLAGCODE_ON;
}
else if (mode == 1)
{
JZSDK_LOG_INFO("低温标定");
Kt_Irc_deal_cfg->LowT_flag = JZ_FLAGCODE_ON;
}
}
\ No newline at end of file
... ...
... ... @@ -26,9 +26,6 @@ extern "C" {
/* Exported functions --------------------------------------------------------*/
T_JZsdkReturnCode JZsdk_Kt_Irc_Camera_Init();
T_JZsdkReturnCode JZsdk_Kt_Irc_ShutterSwitch(int value);
T_JZsdkReturnCode Kt_Irc_Set_OutputPixelColorMode(int value);
T_JZsdkReturnCode Kt_Irc_Set_CorrectionMode(int mode);
T_JZsdkReturnCode Kt_Irc_Set_GasEnhancementColor(int mode);
#ifdef __cplusplus
... ...