Directorio de artículos
**Filtro de medios de transmisión por secuencias - AVFilter**
**Descripción de la función**:
**Nombre de la función**: **avfilter_graph_alloc**
**Función**: Equivalente al contexto unificado de todos los filtros
**Opciones del parámetro avfilter_init_str* *:
**abuffersink (exportación final de datos multimedia) **
**aformat (formato de datos multimedia)**
**amix (lugar de mezcla)**:
**abuffer (entrada de datos multimedia)**
* *volumen (ajustar datos multimedia) volumen y otros parámetros)**
**Proceso de función de audio** :
**Proceso de mezcla** :
**Proceso AvFilterContext** :
**Inicializar proceso AVFilter** :
**Ejemplo**:
* *Remix**:
Streaming Filtro de medios - AVFilter
Descripción de la función :
-
Nombre de la función : avfilter_graph_alloc
-
Función : Equivale al contexto unificado de cerrar todos los filtros.
Opciones del parámetro avfilter_init_str :
llave | tipo de valor | opción de valor | Valores predeterminados | explicar |
---|---|---|---|---|
NULO | NULO | NULO | NULO | NULO |
-
aformat (formatear datos multimedia)
-
llave tipo de valor opción de valor Valores predeterminados explicar muestra_fmts CADENA 0 Formato de muestra formateado tasas_de_muestra CADENA 0 frecuencia de muestreo formateada diseños_canal CADENA 0 Diseño de canal formateado -
amix (lugar de mezcla) :
llave | tipo de valor | opción de valor | Valores predeterminados | explicar |
---|---|---|---|---|
entradas | EN T | INT16_T_MAX | 2 | Introduzca el número de audio |
duración | EN T | 0 ~ 2 | 0 | 0 ~ más largo (sujeto a la entrada más larga) 1 ~ más corto (sujeto a la entrada más corta) 2 ~ primero (sujeto a la primera entrada) |
transición_deserción | FLOTAR | INT32_T_MAX | 2.0 | Tiempo de transición en segundos para la renormalización del volumen cuando finaliza el flujo de entrada |
pesas | CADENA | 0 | “1 1” | establecer pesos para cada entrada |
normalizar | BOOL | verdadera o falsa | verdadero | entrada de escala |
-
abuffer (entrada de datos multimedia)
llave | tipo de valor | opción de valor | Valores predeterminados | explicar | |
---|---|---|---|---|---|
base_tiempo | AV_OPT_TYPE_RATIONAL | INT32_T_MAX | 0 |
|
|
tasa_de_muestra | EN T | INT32_T_MAX | 0 |
|
|
muestra_fmt | AV_OPT_TYPE_SAMPLE_FMT | -1 ~ INT32_T_MAX | -1 |
|
|
diseño_canal | CADENA |
|
|||
canales | EN T | INT32_T_MXA | 0 |
|
-
volumen (ajustar el volumen de datos multimedia y otros parámetros)
llave | tipo de valor | opción de valor | Valores predeterminados | explicar |
---|---|---|---|---|
volumen | CADENA | 1.0 | Establecer expresión de ajuste de volumen 1.0 = 100% | |
precisión | EN T | 0 ~ 2 | 1 | Seleccione precisión matemática 0 ~ fijo (seleccione punto fijo de 8 bits) 1 ~ flotante (seleccione punto fijo de 32 bits) 2 ~ doble (seleccione punto fijo de 64 bits) |
evaluar | EN T | 0 ~ 1 | 0 | specify when to evaluate expressions 0 ~ once (eval volume expression once) 1 ~ frame (eval volume expression per-frame) |
replaygain | INT | 0 ~ 3 | 0 | Apply replaygain side data when present 0 ~ drop (replaygain side data is dropped) 1 ~ ignore (replaygain side data is ignored) 2 ~ track (track gain is preferred) 3 ~ album (album gain is preferred) |
replaygain_preamp | DOUBLE | -15.0 ~ 15.0 | 0.0 | Apply replaygain pre-amplification |
replaygain_noclip | BOOL | true or false | true | Apply replaygain clipping prevention |
音频功能流程 :
-
初始化AVFilter流程 :
-
实例:
-
混音:
-
//本实例不做任何异常判断 //核心 使用过滤器必备 AVFilterGraph * pFilterGraph = avfilter_graph_alloc(); /***************** 查找获取相应的过滤器 *****************/ //abuffersink - 音频出口 const AVFilter* pFilterABuffsink = avfilter_get_by_name("abuffersink"); //aformat - 对音频进行重新格式化 const AVFilter* pFilterAFormat = avfilter_get_by_name("aformat"); //amix - 将音频数据混音汇总 const AVFilter* pFilterAMix = avfilter_get_by_name("amix"); //abuffer - 音频入口 const AVFilter* pFilterABuffer = avfilter_get_by_name("abuffer"); //volume - 音频音量调整 const AVFilter* pFilterVolume = avfilter_get_by_name("volume"); /************ 根据相应过滤器创建过滤器实例 ************/ //abuffersink实例 AVFilterContext* pFilterCtxABuffSink = avfilter_graph_alloc_filter(pFilterGraph, pFilterABuffsink, "sink"); //aformat实例 AVFilterContext* pFilterCtxAFormat = avfilter_graph_alloc_filter(pFilterGraph, pFilterAFormat, "format"); //amix实例 AVFilterContext* pFilterCtxAMix = avfilter_graph_alloc_filter(pFilterGraph, pFilterAMix, "mix"); //abuffer - 入口0 实例 AVFilterContext* pFilterCtxABuffer_0 = avfilter_graph_alloc_filter(pFilterGraph, pFilterABuffer, "buffer0"); //abuffer - 入口1 实例 AVFilterContext* pFilterCtxABuffer_1 = avfilter_graph_alloc_filter(pFilterGraph, pFilterABuffer, "buffer1"); //volume - 控制入口0的音量 实例 AVFilterContext* pFilterCtxVolume_0 = avfilter_graph_alloc_filter(pFilterGraph, pFilterVolume, "volume0"); /****************** 参数选项设置 ********************/ //abuffersink - 参数设置 avfilter_init_str(pFilterCtxABuffSink, nullptr); //aformat - 参数设置 - 采样率:44100 | 采样格式:f32 | 声道布局:双声道 avfilter_init_str(pFilterCtxAFormat, "sample_rates=44100:sample_fmts=flt:channel_layouts=0x3"); //amix - 参数设置 - 输入音频流数:2 | 持续时长:最长的音频为准 | dropout_transition:输入流结束时,容量重整时间 avfilter_init_str(pFilterCtxAMix, "inputs=2:duration=longest:dropout_transition=0"); //abuffer入口0 - 参数设置 - 采样率:44100 | 采样格式:s16 | 声道布局:双声道 avfilter_init_str(pFilterCtxABuffer_0, "sample_rate=44100:sample_fmt=s16:channel_layout=0x3"); //abuffer入口1 - 参数设置 - 采样率:48000 | 采样格式:flt | 声道布局:双声道 avfilter_init_str(pFilterCtxABuffer_1, "sample_rate=48000:sample_fmt=flt:channel_layout=0x3"); //volume 0 - 参数设置 - 音量 10% avfilter_init_str(pFilterCtxVolume_0, "volume=0.1"); /************ 对目前个不相关的过滤器做连接 *************/ //abuffer入口0 -> volume0 avfilter_link(pFilterCtxABuffer_0, 0, pFilterCtxVolume_0, 0); //volume0 -> amix 混音 avfilter_link(pFilterCtxVolume_0, 0, pFilterCtxAMix, 0); //abuffer入口1 -> amix avfilter_link(pFilterCtxABuffer_1, 0, pFilterCtxAMix, 1); //amix -> aformat avfilter_link(pFilterCtxAMix, 0, pFilterCtxAFormat, 0); //aformat -> abuffersink avfilter_link(pFilterCtxAFormat, 0, pFilterCtxABuffSink, 0); //graph整合 avfilter_graph_config(pFilterGraph, nullptr); bool bReadFileEnd_0 = false; bool bReadFileEnd_1 = false; AVFrame* pFrame_0 = av_frame_alloc(); AVFrame* pFrame_1 = av_frame_alloc(); AVFrame* pFrameOut = av_frame_alloc(); /****** * * 打开文件、初始化avframe操作 * ******/ while(!bReadFileEnd_0 || !bReadFileEnd_1 ) { /******* 输入其一 *******/ if(!bReadFileEnd_0) { /*** * 读取 pcm 一帧数据 ***/ if(/* Read File End */) bReadFileEnd_0 = ture; } /******* 输入其二 *******/ if(!bReadFileEnd_1) { /*** * 读取 pcm 一帧数据 ***/ if(/* Read File End */) bReadFileEnd_1 = ture; } /******* 只要其中一路还有数据就必须得传入数据 *******/ //传入的数据流其一 - 通过abuffer0传入 av_buffersrc_add_frame(pFilterCtxABuffer_0, bReadFileEnd_0 ? nullptr : pFrame_0); //传入的数据流其二 - 通过abuffer1传入 av_buffersrc_add_frame(pFilterCtxABuffer_1, bReadFileEnd_1 ? nullptr : pFrame_1; /****** 读取混音后的数据 ******/ while(true) { //从abuffersink中获取一帧数据 if(av_buffersink_get_frame(pFilterCtxABuffSink, pFrameOut) < 0) { //读取失败则表示过滤器中已经不存在数据了,需要重新往里添加帧 break; } /*** * 将数据写入输出文件 ***/ } }