请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

录制没有声音

群公告里并没有看到关于录制无声音适合我的解决方案

这是我通过ffmpeg命令采集音频查看到的音频参数

Audio: pcm_s16le ([1][0][0][0] / 0x0001), 48000 Hz, 1 channels, s16, 768 kb/s

然后我播放的时候没有声音,个人感觉音频没声音跟这三个参数应该无关吧,最多就是解码出来声音杂乱无章,也不至于无声,应该还是录制上出了问题。

#include "testc.h"
#include <unistd.h>

void rec_audio(){
    
    int ret = 0;
    char errors[1024];
    
    AVFormatContext *fmt_ctx = NULL;
    AVDictionary *options = NULL;
    
    char* device_name = ":0";
    
    AVPacket pkt;
    int count = 0;
    
    //注册音频硬件
    avdevice_register_all();
    
    //获取文件类型
    AVInputFormat *iformat = av_find_input_format("avfoundation");
    
    //打开设备
    ret =  avformat_open_input(&fmt_ctx, device_name, iformat, &options);
    
    if(ret < 0){
        av_strerror(ret, errors, 1024);
        printf(stderr,"Failed to open Audio Device,[%d]%s\n",ret,errors);
        return;
    }
    
    printf("Open Device Succes\n");
    
    av_init_packet(&pkt);
    char *out ="/Users/lihaochen/Downloads/audio.pcm";
    FILE *outfile = fopen(out,"wb+");

  
    while(count < 500){
        //从设备读取数据
        ret = av_read_frame(fmt_ctx, &pkt);
        if(ret == -35){
            av_packet_unref(&pkt);
            printf("device not ready");
            sleep(1);
            continue;
        }
        if(ret == 0){
            printf("packet size is %d \n",pkt.size);
            //写入文件
            fwrite(pkt.data, pkt.size, 1, outfile);
            fflush(outfile);
            //释放pkt
            av_packet_unref(&pkt);
            usleep(30 * 1000);
        }else{
            av_packet_unref(&pkt);
            break;
        }
        count++;
    }
    
    
    if(ret < 0){
        av_strerror(ret, errors, 1024);
        printf("Failed to open Audio Device,[%d]%s\n",ret,errors);
    }
    
    //关闭文件
    fclose(outfile);
  
    //关闭设备,释放上下文
    avformat_close_input(&fmt_ctx);
    printf("finish");
}

正在回答 回答被采纳积分+3

1回答

李超 2022-06-21 11:49:39

录制的文件里有数据吗?文件大小是多少?

0 回复 有任何疑惑可以回复我~
  • 提问者 MarcoLhc #1
    录出来的文件正好1MB
    回复 有任何疑惑可以回复我~ 2022-06-21 20:18:46
  • 提问者 MarcoLhc #2
    用ffplay播放的时候会出现这个
    [s16le @ 0x7fb140b082c0] Estimating duration from bitrate, this may be inaccurate
    但我尝试换成32位也不行
    回复 有任何疑惑可以回复我~ 2022-06-21 22:29:42
  • 提问者 MarcoLhc #3
    录的就有问题,我把pkt.data打印了一下,是空的
    printf("内容:%s\n",pkt.data);
    这条打印的语法应该没问题吧
    回复 有任何疑惑可以回复我~ 2022-06-21 22:46:16
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信