[libav-bugs] [Bug 475] New: 使用avconv录音时异常退出

bugzilla-daemon at aruru.libav.org bugzilla-daemon at aruru.libav.org
Fri Mar 15 09:14:06 CET 2013


https://bugzilla.libav.org/show_bug.cgi?id=475

           Summary: 使用avconv录音时异常退出
           Product: Libav
           Version: 9
          Platform: ARM
        OS/Version: Linux
            Status: NEW
          Severity: enhancement
          Priority: Normal
         Component: utilities
        AssignedTo: bugzilla at libav.org
        ReportedBy: lx9744 at 163.com


在终端使用./avconv -f alsa -ac 1  -i hw:0  /out.wav 录音时提示
[wav @ 0x3eae0] Application provided invalid, non monotonically increasing dts
to muxer in stream 0: 68831 >= 68819
av_interleaved_write_frame(): Invalid argument

-------------------------------------------------------------------------------
跟踪发现alsa-audio-dec.c文件中的audio_read_packet函数
pkt->pts 计算溢出,导致后一次的pts比前一次的小导致的
下面是修改后的代码
pkt->pts = timestamp.tv_sec * 1000000LL
               + (timestamp.tv_nsec * 1LL * st->codec->sample_rate 
                  - ts_delay * 1000000000LL + st->codec->sample_rate * 500LL)
               / (st->codec->sample_rate * 1000LL);

-------------------------------------------------------------------------------
修改后偶尔还会出现此问题
发现snd_pcm_htimestamp(s->h, &ts_delay, &timestamp);
取回的ts_delay会出现和时间不匹配的现象。
比如
tv_sec | tv_nsec | sample_rate | ts_delay | pkt->pts
103    918049000  44100          68        103916507.5
103    918160000  44100      109        103915688.8
虽然tv_sec 和 tv_nsec 是增加的但是由于ts_delay 增加的更快,导致pkt->pts反而更小了。我查过alsa代码ts_delay
的值是有下面这个函数计算的。
static inline snd_pcm_uframes_t snd_pcm_mmap_capture_avail(snd_pcm_t *pcm)
{
    snd_pcm_sframes_t avail;
    avail = *pcm->hw.ptr - *pcm->appl.ptr;
    if (avail < 0)
        avail += pcm->boundary;
    return avail;
}
根据alsa资料这个值可能是缓冲区中未读取的帧数量。按照这个是否要求alsa中硬件流必须严格按照采样率来填充这个缓冲区,而不能有一点额误差,否则就会导致pts的计算不正确

-- 
Configure bugmail: https://bugzilla.libav.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are watching all bug changes.


More information about the libav-bugs mailing list