第一个ffmpeg程序

在进行使用ffmpeg进行编写程序时,首先要记得进行注册设备(avdevice_register_all ),程序运行时,只需要注册一次就可以

avdevice_register_all 是 FFmpeg 多媒体处理库中的一个函数,其作用是注册所有可用的音视频设备。具体来说,它会将系统中找到的所有音视频输入和输出设备(如摄像头、麦克风等)注册到 FFmpeg 中,以便后续可以通过 FFmpeg 的 API 接口对这些设备进行访问和操作。
在使用 FFmpeg 进行音视频处理时,有时需要读取或者写入来自外部设备(如摄像头、音频接口)的数据,这时就可以使用 avdevice_register_all 来初始化并注册这些设备,以便后续可以通过 FFmpeg 的统一接口来进行数据的读取和写入。
总结来说,avdevice_register_all 的作用就是在 FFmpeg 应用程序中,初始化并注册所有可用的音视频设备,使得这些设备可以被 FFmpeg 使用。

本程序主要实现了使用ffmpeg来实现一个录音功能,其界面如图所示

当我们进行点击按钮时,会触发按钮信号并进行调用ffmpeg的一些方法进行录音操作。其主要代码如下所示:

bash 复制代码
void MainWindow::on_pushButton_clicked()
{
    //获取输入格式对象
#ifdef Q_OS_WIN
    const char* fmtName = "dshow";//"dshow"代表windows输入格式
#else
    const char* fmtName = "avfoundation";//"avfoundation"代表mac输入格式
#endif
    const AVInputFormat *fmt = av_find_input_format(fmtName);//获取输入格式对象
    if(!fmt)
    {
        qDebug() << "获取输入格式对象失败" << fmtName;
        return;
    }

    //格式上下文(将来可以利用上下文操作设备)
    AVFormatContext *ctx = nullptr;
    //设备名称
    const char* deviceName = "audio=麦克风 (Realtek(R) Audio)";
    //打开设备
    int ret = avformat_open_input(&ctx,deviceName,fmt,nullptr);
    if(ret < 0)
    {
        char errbuf[1024];
        av_strerror(ret,errbuf,sizeof(errbuf));
        qDebug() << "打开设备失败"<< errbuf;
    }

    qDebug() << ctx;

    //文件名
    const char *filename = "D:/ffmpeg/ffm.pcm";
    QFile file(filename);

    //打开文件
    //WriteOnly:只写模式。如果文件不存在,就创建文件;如果文件存在就会清空文件
    if(!file.open(QFile::WriteOnly))
    {
        qDebug()<<"文件打开失败"<< filename;

        //关闭设备
        avformat_close_input(&ctx);
        return;
    }

    //数据包
    AVPacket pkt;
    //采集包
    av_read_frame(ctx,&pkt);
    qDebug()<< pkt.size;

    //采集的次数
    int count = 10;

    //不断采集数据
    while(count-- > 0 && av_read_frame(ctx,&pkt) == 0)
    {
        //将数据写入文件
        file.write((const char *) pkt.data,pkt.size);
    }

    //释放资源
    //关闭资源
    file.size();

    //关闭设备
    avformat_close_input(&ctx);
}

在进行操作时,切记要先进行配置如下的库:

ffmpeg还有他自己的io语法,如下所示:

bash 复制代码
//输出格式对比(在进行输出时,会存在缓存区的概念,如果没有换行符的存在,那么当输出内容时会先存储到缓冲区)
    //c
    printf("printf------------");

    //c++
    std::cout << "std::cout -------" << endl;

    //ffmpeg
    av_log_set_level(AV_LOG_DEBUG);//设置错误输出等级,等于或者超过这个等级就会进行输出

    //ffmpeg的输出格式不带回车
    av_log(nullptr, AV_LOG_FATAL,"av-----log");
    av_log(nullptr,AV_LOG_DEBUG,"av_log_debug");

    //刷新缓存区,直接进行输出
    fflush(stdout);//刷新普通输出
    fflush(stderr);//刷新错误输出
    qDebug() << "1111111";//QT输出格式自己带回车
相关推荐
heqingchun162 小时前
RK3568 交叉编译与部署:MPP + FFmpeg 硬解全流程
ffmpeg·视频编解码
云贝贝贝1 天前
OceanBase 生产运维 7 个高频现场:从连不上到误删兜底
运维·ffmpeg·oceanbase
≮傷£≯√1 天前
ffmpeg 2个图片合并为视频
ffmpeg·音视频
zone_z4 天前
07 · 等待事件与 OWI 方法:从 OSW 到 BUG 的完整破案实录
linux·数据库·oracle·ffmpeg·bug·troubleshooting
'2065 天前
**写了个自动整理下载视频的脚本:按片名归档、自动重命名、生成目录索引
开发语言·python·ffmpeg·音视频·cctv
殷忆枫5 天前
嵌入式Linux下基于FFmpeg实现MP4解码为JPG图片(SSD202D交叉编译实战)
linux·运维·ffmpeg
≮傷£≯√6 天前
图片合并成视频 img2video ffmpeg
ffmpeg·音视频
HY小宝F7 天前
树莓派 FFmpeg 实战笔记(二):命令行、源码编译与硬件编码的真相
学习·职场和发展·ffmpeg
qq_316837757 天前
uniapp + Vite + ffmpeg-wasm 0.12.x 集成示例
ffmpeg·uni-app·wasm
qingmiaozhuan7 天前
电脑录屏黑屏?只有声音没画面?从原理到排查一篇搞定
ffmpeg·电脑·音视频开发·录屏技术·电脑录屏