AVFilter - filtro de transmisión

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 :

  • **abuffersink (exportación final de datos multimedia)**

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
base de tiempo
tasa_de_muestra EN T INT32_T_MAX 0
tasa de muestreo de entrada
muestra_fmt AV_OPT_TYPE_SAMPLE_FMT -1 ~ INT32_T_MAX -1
formato de muestra de entrada
diseño_canal CADENA
Diseño del canal de entrada
canales EN T INT32_T_MXA 0
número de canales
  • 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

音频功能流程 :

  • 混音流程 :

  • AvFilterContext流程 :

 

  • 初始化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;
            }
            
            /***
            *   将数据写入输出文件
            ***/
            
        }
    
    }
    
    
    
    
    

Supongo que te gusta

Origin blog.csdn.net/qq_39436605/article/details/131723122
Recomendado
Clasificación