音视频-视频录制编程

Mac下ffmpeg视频录制
ffmpeg -f avfoundation -framerate 30 -i 0 out.yuv
Mac下ffmpeg音频录制
ffmpeg -f avfoundation -i :0 out.wav

对比命令行的录制音频和视频. 其实可以猜得到, 视频录制编程 跟音视频-ffmpeg录制PCM是一样的思路的.

主要步骤

注册设备 avdevice_register_all();
获取输入格式对象 av_find_input_format
打开设备 avformat_open_input
采集数据 av_read_frame
释放资源 avformat_close_input

Mac平台添加info

<key>NSCameraUsageDescription</key>
<string>申请使用摄像头进行录制</string>

如果添加了还报错, 删除之前编译好的工程.

可能会遇到的格式支持方案的报错

[avfoundation @ 0x10c0c5600] Selected framerate (29.970030) is not supported by the device.
[avfoundation @ 0x10c0c5600] Supported modes:
[avfoundation @ 0x10c0c5600]   1280x720@[1.000000 30.000000]fps
[avfoundation @ 0x10c0c5600]   1280x720@[1.000000 30.000000]fps
[avfoundation @ 0x10c0c5600]   1280x720@[1.000000 30.000000]fps

设置符合规则的像素格式和视频大小, 如何设置

通过API的注释中搜索, 可以搜索关键字"pixel_format" 或者是"pixel", 像素格式可以发现

 * @code
 * AVDictionary *options = NULL;
 * av_dict_set(&options, "video_size", "640x480", 0);
 * av_dict_set(&options, "pixel_format", "rgb24", 0);
 *
 * if (avformat_open_input(&s, url, NULL, &options) < 0)
 *     abort();
 * av_dict_free(&options);

就知道了怎么设置视频参数格式


代码实现

// 格式名称,设备名称
#ifdef Q_OS_WIN
    // todo win下的配置根据电脑来, 因为win没有摄像头, 用Mac的来实现先
#else
    #define FMT_NAME "avfoundation"
    #define DEVICE_NAME "0"
    #define FILEPATH "/Users/liliguang/Desktop/"
    #define FILENAME "record_to_yuv.yuv"
    #define VEDIO_SIZE "1280x720"
    #define FRAMERATE "30"
    #define PIXEL_FORMAT "uyvy422"
#endif
void VedioThread::run() {
    qDebug() << this << "开始执行----------";
    // 获取输入格式对象
    AVInputFormat *fmt = av_find_input_format(FMT_NAME);
    if (!fmt) {
        qDebug() << "获取输入格式对象失败" << FMT_NAME;
        return;
    }
    qDebug() << "fmt : " << fmt;
    // 格式上下文(将来可以利用上下文操作设备)


    AVFormatContext *ctx = nullptr;


    AVDictionary *options = NULL;
    av_dict_set(&options, "video_size", VEDIO_SIZE, 0);
    av_dict_set(&options, "framerate", FRAMERATE, 0);
    av_dict_set(&options, "pixel_format", PIXEL_FORMAT , 0);

    // 打开设备
    int ret = avformat_open_input(&ctx, DEVICE_NAME, fmt, &options);
    if (ret < 0) {
        char errbuf[1024];
        av_strerror(ret, errbuf, sizeof (errbuf));
        qDebug() << "打开设备失败" << errbuf;
        return;
    }
    qDebug() << "ret : " << ret;

    // 文件名
    QString filename = FILEPATH;
    filename += FILENAME;
    QFile file(filename);
    if (!file.open(QFile::WriteOnly)) {
        qDebug() << "文件打开失败" << filename;
        // 关闭设备
        avformat_close_input(&ctx);
        return;
    }
    // 数据包
    AVPacket pkt;
    while (!isInterruptionRequested()) {
        // 不断采集数据
        ret = av_read_frame(ctx, &pkt);
        if (ret == 0) { // 读取成功
            // 将数据写入文件
            file.write((const char *) pkt.data, pkt.size);
        } else if (ret == AVERROR(EAGAIN)) { // 资源临时不可用
            continue;
        } else { // 其他错误
            char errbuf[1024];
            av_strerror(ret, errbuf, sizeof (errbuf));
            qDebug() << "av_read_frame error" << errbuf << ret;
            break;
        }
    }
    // 释放资源
    // 关闭文件
    file.close();
    // 关闭设备
    avformat_close_input(&ctx);
    qDebug() << this << "正常结束----------";
}

正常输出:
2021-07-14 23:30:40.838608+0800 9_record_to_yuv[10634:364232] VedioThread(0x12583ba30) 开始执行----------
2021-07-14 23:30:40.838828+0800 9_record_to_yuv[10634:364232] fmt :  0x10166fac0
2021-07-14 23:30:40.841558+0800 9_record_to_yuv[10634:364232] [plugin] AddInstanceForFactory: No factory registered for id <CFUUID 0x1097673c0> F8BB1C28-BAE8-11D6-9C31-00039315CD46
2021-07-14 23:30:40.865234+0800 9_record_to_yuv[10634:364232]  HALC_ShellDriverPlugIn::Open: Can't get a pointer to the Open routine
2021-07-14 23:30:40.865519+0800 9_record_to_yuv[10634:364232]  HALC_ShellDriverPlugIn::Open: Can't get a pointer to the Open routine
2021-07-14 23:30:40.886784+0800 9_record_to_yuv[10634:364232] [plugin] AddInstanceForFactory: No factory registered for id <CFUUID 0x12583f000> 30010C1C-93BF-11D8-8B5B-000A95AF9C6A
2021-07-14 23:30:43.274195+0800 9_record_to_yuv[10634:364232] ret :  0
2021-07-14 23:30:56.460552+0800 9_record_to_yuv[10634:364232] [] CMIO_DAL_PlugIn.cpp:269:StreamCopyBufferQueue Error: 1852797029, got an error from the plug-in routine
2021-07-14 23:30:56.464971+0800 9_record_to_yuv[10634:364232] VedioThread(0x12583ba30) 正常结束----------
2021-07-14 23:30:56.465248+0800 9_record_to_yuv[10634:364047] VedioThread(0x12583ba30) 析构(内存被回收)

使用FFmpeg命令行播放

ffplay -video_size 1280x720 -pixel_format uyvy422 -framerate 30 record_to_yuv.yuv 

自测播放正常

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容