首页 > 其他分享 >ffmpeg之采集音频

ffmpeg之采集音频

时间:2023-09-07 15:44:46浏览次数:47  
标签:ffmpeg pkt 音频 ctx ret 采集 av NULL fmt


 

一、打开音频设备

设备可以是多媒体文件和物理设备

#ifndef TESTC_H
#define TESTC_H

#include <stdio.h>
#include "libavutil/avutil.h"
#include "libavdevice/avdevice.h"  //打开音频设备相关的头文件
#include "libavformat/avformat.h"  //ffmpeg下的所有文件都是以格式来呈现的

#endif

输入设备为同目录下的video_2.mp4

#include "testc.h"


void main(int argc, char **argv)
{
    int ret = 0;
    char errors[1024];
    static AVFormatContext *fmt_ctx = NULL;   //ffmpeg下的“文件描述符”

    char *devicename =  "./video_2.mp4";
    //register audio device
    avdevice_register_all();

    //get format
    AVInputFormat *iformat = av_find_input_format("alsa");

    if( (ret = avformat_open_input(&fmt_ctx, devicename, NULL, NULL)) < 0)
    {
        av_strerror(ret, errors, 1024);
        printf("Failed to open audio device, [%d]%s\n", ret, errors);
        return;
    };

    av_log_set_level(AV_LOG_DEBUG);
    av_log(NULL, AV_LOG_DEBUG, "hello, world\n");

    return;
}

二、从设备中读取音频数据

 
 
 

内存泄漏注意:创建了必须释放

1. avformat_open_input(&fmt_ctx, devicename, NULL, NULL);
2. avformat_close_input(&fmt_ctx);
1. av_init_packet(&pkt);
2. av_read_frame(fmt_ctx, &pkt)
3. av_packet_unref(&pkt);

所需头文件

#include "libavcodec/avcodec.h"

代码

#include "testc.h"


void main(int argc, char **argv)
{

    int ret = 0;
    char errors[1024] = {0};
    //context
    static AVFormatContext *fmt_ctx = NULL;   //ffmpeg下的“文件描述符”

    //paket
    int count = 0;
    AVPacket pkt;

    char *devicename =  "./video_2.mp4";
    //register audio device
    avdevice_register_all();

    //get format
    AVInputFormat *iformat = av_find_input_format("alsa");

    //open video
    if( (ret = avformat_open_input(&fmt_ctx, devicename, NULL, NULL)) < 0)
    {
        av_strerror(ret, errors, 1024);
        printf("Failed to open audio device, [%d]%s\n", ret, errors);
        return;
    };

    av_init_packet(&pkt);
    //read data form video
    while(ret = (av_read_frame(fmt_ctx, &pkt))== 0&& 
        count++ < 500) {
        av_log(NULL, AV_LOG_INFO, "pkt size is %d(%p), count=%d\n",
        pkt.size,pkt.data, count);
        av_packet_unref(&pkt);//releas pkt
    }

    avformat_close_input(&fmt_ctx);//releas ctx

    av_log_set_level(AV_LOG_DEBUG);
    av_log(NULL, AV_LOG_DEBUG, "finish!\n");

    return;
}

三、录制音频

 

1.创建文件

创建文件来保存采集的音频数据

//create file
char *out = "/home/lee/vido_learn/mytest/audio.pcm";
FILE *outfile = fopen(out,"wb+");

2.写入数据

//write file 
fwrite(pkt.data, pkt.size, 1, outfile);
fflush(outfile);

3.关闭文件

//close file
fclose(outfile);

出于效率考虑fwrite()会先把数据写到缓存区,待缓存区有一定大小的块数据后才把通过文件io操作磁盘将数据写入文件,加入fflush()会立即将数据写入磁盘

四、执行程序

执行程序后会生成audio.pcm文件


 

在命令行使用ffply进行播放

 ffplay -ar 44100 -ac 2 -f f32le audio.pcm 

-ar 44100 采样率44100Hz
-ac 2 通道数
-f f32le 采样大小32位

五、音频重采样

 
 
 
 
 

包含头文件

#include "libswresample/swresample.h"
uint8_t **src_data = NULL;
    int src_linesize = 0;

     uint8_t **dts_data = NULL;
    int dts_linesize = 0;   

    //4096/4=1024/2=512
    //创建输入缓冲区
    av_samples_alloc_array_and_samples(&src_data,       //输出缓冲区地址
                                       &src_linesize,    //缓冲区的大小
                                       2,               //通道个数
                                       512,             //单通道采样个数
                                       AV_SAMPLE_FMT_FLT,//采样格式
                                       0);
    //创建输出缓冲区
    av_samples_alloc_array_and_samples(&dts_data,       //输出缓冲区地址
                                       &dts_linesize,    //缓冲区的大小
                                       2,               //通道个数
                                       512,             //单通道采样个数
                                       AV_SAMPLE_FMT_S16,//采样格式
                                       0);
//重采样
          swr_convert(swr_ctx, 
                    dts_data, 
                    dts_linesize, 
                    (const uint8_t **)src_data, 
                    src_linesize);

 

标签:ffmpeg,pkt,音频,ctx,ret,采集,av,NULL,fmt
From: https://www.cnblogs.com/kn-zheng/p/17685121.html

相关文章

  • ffmpeg中的采集麦克风的 API
    在FFmpeg中,可以使用libavdevice库来采集麦克风的音频。下面是一个简单示例:#include<stdio.h>#include<stdlib.h>#include<string.h>#include<stdint.h> #include<libavformat/avformat.h>#include<libavdevice/avdevice.h> intmain(){av_r......
  • 干货贴|免费AI数据标注工具-多功能语音音频标注软件
    图像标注实际应用比较广泛,因此前几期我们分享了不少图像标注的内容,不过大家也有反馈希望对文本标注、语音标注有一些学习,小A那么宠粉,必须安排起来。工欲善其事,必先利其器。标注工具是数据标注行业的基础,一款好用的标注工具是提升标注效率与产出高质量标注数据的关键。之前我也分享......
  • 基于工业物联网平台的智能工厂数据采集系统
    在传统制造业中,数据采集和数据分析一直是难点问题。随着设备越来越多、现场环境越来越复杂,同时对于持续性生产要求的不断提高,带动了工业物联网技术的快速发展,基于工业物联网平台的数据采集系统逐渐成为智能工厂的必备方案。通过将工业现场中的各种设备、传感器、PLC等连接到数之能......
  • rodert教你学FFmpeg实战这一篇就够了
    rodert教你学FFmpeg实战这一篇就够了前言todo有人问rodert哥这篇文章干货有多干,问就是,硌牙。ffmpeg有多强大,我想你都知道了,现在很多市场上的剪辑软件都是基于它做的,只是加了一些包装。读完本篇,你会发现一切如此简单。1.简介官网地址:https://trac.ffmpeg.org/wikiFFm......
  • uni-app实现音频播放器(ios)
    在uni-app中,ios有自带的音频播放器,和网易云一样,安卓需要自己写1.全局定义constbgAudioManager=uni.getBackgroundAudioManager();bgAudioManager.title=this.info.name;//音频名称bgAudioManager.singer='';//作者bgAudioManager.coverImgUrl=this.info.pic;/......
  • ​​Android平台GB28181历史视音频文件下载规范探讨及技术实现
    技术背景上篇blog,我们提到了Android平台GB28181历史视音频文件检索规范探讨及技术实现,文件检索后,GB28181平台侧,可以针对文件列表进行回放或下载操作,本文主要探讨视音频文件下载相关。规范解读视音频文件下载基本要求SIP服务器接收到媒体接收者发送的视音频文件下载请求后向媒体流......
  • 医院影像科PACS/RIS系统源码 患者登记、图像采集、图像存储、报告产生
    医院PACS系统源码一套医学影像存储与传输系统,PACS部分主要提供医学影像获取、影像信息网络传递、大容量数据存储、影像显示和处理、影像打印等功能。RIS主要提供分诊登记、叫号、检查报告生成和打印等功能。本套影像存储与传输系统将二者进行无缝对接,提供了一个完整的集患者登记、......
  • 工程监测振弦采集仪应用于隧道的详细方案
    工程监测振弦采集仪是一种专门用于工程结构振动监测的仪器设备。它可以广泛应用于桥梁、隧道、高层建筑、风电等领域,在工程结构监测中起到了重要作用。本文将着重介绍工程监测振弦采集仪在隧道监测中的应用方案。隧道是一种长的地下通道,一般用于交通工具(如汽车、火车、地铁等)和人......
  • Android平台GB28181历史视音频文件检索规范探讨及技术实现
    技术背景我们在做Android平台GB28181设备接入侧模块的时候,特别是执法记录仪或类似场景,系统除了对常规的录像有要求,还需要能和GB28181平台侧交互,比如实现设备侧视音频文件检索、下载或回放。本文假定记录仪或相关设备已经完成录像,主要来探讨下设备视音频文件检索相关。规范解读先回......
  • 嵌入式DSP教学实验箱_数字信号处理教程:3-5 AAC音频编码实验
    1、实验目的本次实验操作教程是基于创龙教仪DSP教学实验箱:TL6748-PlusTEB演示录制的。本次实验的目的是了解AAC音频格式,掌握AAC音频编码的原理,并实现将WAV格式的音频编码为AAC格式。2、实验原理音频编解码的主要对象是音乐和语音,音频的编解码格式可分为无压缩的格式、无损压缩格式......