명명된 파이프에 대한 arecord wav 파일 크기 제한

명명된 파이프에 대한 arecord wav 파일 크기 제한

상상하다:

운영 체제: 라즈베리 버스터

  1. 다음과 같은 오디오 체인이 있습니다USB 오디오 입력->record->named Pipe->forked-daapd. 현재 구성에서는기록그리고 포크된 daapd표준에 따라 모든 설정체계제공하다.
  2. 목표는 턴테이블에서 네트워크 오디오 엔드포인트(SONOS)로 오디오를 보내는 것입니다.
  3. 파이프라인의 레코드 부분은 매우 간단합니다."arecord -Dplughw:1,0 -t wav -f cd /srv/music/phono-source"
  4. mkfifo를 사용하여 명명된 파이프("phono-source")를 생성한 다음 시작하면기록그리고포크 DAAP서비스, ​​모든 것이 예상대로 작동하는 것 같았습니다.
  5. 구성을 실행 중이지만 "유휴" 상태로 두면, 즉 캐러셀을 사용하지 않는 경우 나중에 원래 명명된 파이프 개체의 이름이 "phono-source-01"로 바뀌고 침묵/잡음을 효과적으로 생성한다고 가정하여 새 개체의 이름이 변경됩니다. 파이프되지 않은 일반 파일 "phono-source-02"가 생성됩니다. arecord는 이제 예상 속도로 크기가 증가하는 새 파일에 데이터를 쓰고 있습니다.
  6. 오디오 출력이 wav 파일의 최대 크기에 도달했다는 것을 깨달을 때까지 한동안 혼란스러웠습니다. 잠시 동안 실행해 본 결과, phono-source-02가 2147483692바이트에 도달했을 때 출력이 새로운 일반 파일 phono-source-03으로 되돌아갔을 때 어느 정도 확인되었습니다.
  7. 나는 wav 파일에 2Gig 제한이 있다는 것을 막연하게 알고 있지만 이것이 물리적 파일 제한이라고 가정하고 있습니다. 이 경우 파이프에 쓰기 때문에 적용되지 않습니다. 분명히 그렇지 않습니다. 여기서 무차별 접근 방식은 각 앨범이 턴테이블에서 재생된 후 레코드 서비스를 종료하고 새 앨범이 시작될 때 이를 시작하는 것입니다.

파이프에 다른 작업을 수행하거나 sox와 같은 대체 오디오 그래버를 사용하여 이 문제를 방지하는 전략에 대한 제안 사항이 있습니까?

어떤 아이디어가 있나요?

답변1

소스코드를 보면aplay.c/arecord.c, 다음 형식의 테이블이 표시됩니다.

static const struct fmt_capture {
    void (*start) (int fd, size_t count);
    void (*end) (int fd);
    char *what;
    long long max_filesize;
} fmt_rec_table[] = {
    {   NULL,       NULL,       N_("raw data"),     LLONG_MAX },
    {   begin_voc,  end_voc,    N_("VOC"),      16000000LL },
    /* FIXME: can WAV handle exactly 2GB or less than it? */
    {   begin_wave, end_wave,   N_("WAVE"),     2147483648LL },
    {   begin_au,   end_au,     N_("Sparc Audio"),  LLONG_MAX }
};

따라서 WAV 파일의 크기는 설계상 제한되어 있음을 알 수 있습니다.

운이 좋을 수도 있습니다 -t raw(샘플 속도와 같은 추가 매개변수가 필요할 수 있음) 또는 -t au(Sun Sparc 오디오 파일 형식) forked-daapd이를 처리할 수 있다고 가정하면(저는 사용한 적이 없습니다 forked-daapd). 64비트 시스템에서 LLONG_MAX는 9223372036854775807이며 파일이 해당 크기에 도달할 때까지 파일 시스템에서 오류가 발생할 수 있습니다.

WAV 파일이 필요한 경우 이 형식의 파일 헤더 크기는 2GB보다 클 수 없으므로 대부분의 구현에는 일종의 제한이 있을 수 있습니다. 최대 파일 크기.

나는 "스트리밍 모드"(내가 아는 한 WAV 사양을 실제로 위반하는)가 있는 레코더의 특정 구현에 대해 알지 못하며 의도적으로 이를 무시합니다. 그렇다고 그것이 존재하지 않는다는 의미는 아닙니다.

관련 정보