gpt4 book ai didi

c++ - 在 OSX 上使用 PortAudio 写入 fifo 并使用 ffmpeg 读取

转载 作者:行者123 更新时间:2023-12-04 23:02:56 27 4
gpt4 key购买 nike

我正在尝试做的事情:

  • 在 PortAudio 中打开我的麦克风作为音频源(工作)
  • 将流写入fifo(有效)
  • 使用 ffmpeg 读取 fifo(不起作用)

  • 在 PortAudio 中,我正在使用 Blocking I/O,如下所示:
    http://portaudio.com/docs/v19-doxydocs/blocking_read_write.html

    在循环中,我这样写入fifo:
    int data = write('/tmp/aaa', sampleBlock, bufferSize);

    当我将它读到 PortAudio 写缓冲区时,它可以工作。
    bytes_read = read('/tmp/aaa', readSampleBlock, bufferSize);
    err = Pa_WriteStream(stream, readSampleBlock, bufferSize)

    当我在控制台上使用 ffmpeg 阅读它时:
    ffmpeg -y -i /tmp/aaa -f s16le -acodec copy -f nut -ar 48000 -ac 2 -v debug -report -acodec copy out.wav

    它只是阻塞了循环,就是这样。

    谁能帮我弄清楚我需要做什么?

    我的代码:
    #define SAMPLE_SIZE (1)
    #define FRAMES_PER_BUFFER (480)
    #define AUDIOFIFO "/tmp/aaa"

    char *sampleBlock = NULL;
    int status, captured_bytes, fifo, bytes_read;


    err = Pa_OpenStream(&stream,
    &inputParameters,
    NULL,
    48000,
    FRAMES_PER_BUFFER,
    paClipOff,
    NULL, /* no callback, use blocking API */
    NULL ); /* no callback, so no callback userData */
    if( err != paNoError ) goto error;

    numBytes = FRAMES_PER_BUFFER * numChannels * SAMPLE_SIZE ;
    sampleBlock = (char *) malloc( numBytes );
    memset( sampleBlock, SAMPLE_SILENCE, numBytes );

    if (status = mkfifo(AUDIOFIFO, 0666) < 0)
    {
    printf("Error making AUDIOFIFO: %s \n", strerror(errno));
    }
    err = Pa_StartStream( stream );
    if( err != paNoError )
    {
    goto error;
    }

    fifo = open(AUDIOFIFO, O_RDWR, O_NONBLOCK);
    if (fifo < 0) printf("Error opening AUDIOFIFO: %s \n", strerror(errno));

    for( i=0; i<(60*48000)/FRAMES_PER_BUFFER; ++i )
    {
    if ((err = Pa_ReadStream(stream, sampleBlock, FRAMES_PER_BUFFER)) != paNoError)
    {
    goto xrun;
    }
    captured_bytes = write(fifo, sampleBlock, FRAMES_PER_BUFFER);
    if (captured_bytes < 0)
    {
    printf("Error writing to AUDIOFIFO: %s \n", strerror(errno));
    }

    framesProcessed += bufferSize;
    }

    最佳答案

    AFAIK, 的通用格式ffmpeg 命令行是:

    ffmpeg <GLOBAL OPTIONS> <INPUT OPTIONS> -i INPUT <OUTPUT OPTIONS> OUTPUT

    即您必须将您的输入流描述为 ffmpeg 在打开它之前。

    所以我认为 -f s16le (至少)必须在 -i /tmp/aaa 之前在您的 ffmpeg 命令行:
    ffmpeg -y -f s16le -i /tmp/aaa ....

    关于c++ - 在 OSX 上使用 PortAudio 写入 fifo 并使用 ffmpeg 读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47419028/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com