2012-11-28 6 views
2

는 얼마나는 FFmpeg의 libav *를 이용하여 오디오 스트림을 디코딩 내 프로세스libavcodec에서 오디오 프레임을 어떻게 디코딩합니까? 여기

[videofile] -> (오디오 패킷을 읽어) -> [PKTS 큐] -> (디코더) -> 난 디코더 후 버퍼를 삽입해야 할 어떤 이유 화자의 샘플 버퍼

[videofile] -> (오디오 패킷을 읽어) -> [PKTS 큐] -> (디코더) -> [샘플 버퍼] -> 스피커의 샘플 버퍼

samples buffer의 오디오 샘플은 LPCM 16 비트입니다. 오디오의 점을 저장하려면 sample buffer 첫 번째 샘플의 pts를 저장하십시오. 그런 식으로, 나는 버퍼에있는 모든 샘플의 pts를 계산할 수 있습니다.

오디오 스트림에 연속 오디오 샘플이있는 경우에만 계산이 정확하다는 문제가 있습니다. ffmpeg의 디코딩 된 오디오 프레임에는 항상 연속 샘플이 포함되어 있습니까?

답변

1

왜 그런 경우가 아닙니까? 디코더는 상위 계층에 표시 할 순서대로 데이터를 제공합니다.

+0

하자 설명한다 디코더는 제 1-> 10 샘플을 포함하는 오디오 프레임을 복호라고하고, 다음 프레임은 제 15> (20)로부터 샘플들을 포함한다. 만약 내가 모든 샘플을 버퍼에 넣으면, 버퍼는 [1..10 15..20]과 같을 것입니다. 왜냐하면 나는 첫 번째 샘플의 pts 만 저장하기 때문에 15에서 20까지의 샘플에 대한 계산은 두 번째 11에서 14까지 침묵 부분이 있기 때문에 잘못 될 것입니다. – jAckOdE

+0

다음 프레임에는 11-14가 손실되면 15-> 20의 샘플이 포함됩니다. 그렇지 않으면 순서대로 나오지, 그렇지? 따라서 들어오는 샘플에 간격이 있으면 예 출력에도 간격이 생기고 디코더가 할 수있는 것이 없습니다. 그러나 들어오는 비트 스트림이 완료되고 유효한 구문과 의미를 가진다면 연속적인 출력을 얻어야합니다. – av501

+0

11-14 (샘플 부분이 없음)의 샘플이없는 경우 프레임이 손실되지 않고 해당 기간 동안 오디오 샘플이 없습니다. – jAckOdE

1

ffmpeg의 디코딩 된 오디오 프레임은 평면 또는 비평면 형식의 샘플을 포함 할 수 있습니다. 당신은 당신이 스피커에 올바른 형식으로 샘플을 전달하고 있는지 확인해야

av_sample_fmt_is_planar(frame->format) 

확인 documentation 를 사용하여이 문제를 확인할 수 있습니다.

그렇다면 libswresample을 사용하여 샘플 형식 변환을 수행 할 수 있습니다.

방법 AVFrame은 평면을 포함하고 비평 데이터 here