문제

iPhone의 스트리밍 오디오에서 Seeking (타임 라인 기능)을 구현하려면 어떻게해야합니까?

AudiofilestreamSeek 방법은 내가 찾기 시작하고 싶은 바이트 오프셋을 취합니다. 나는 재생중인 MP3의 현재 위치를 얻을 수 있고, 사용자가 나중에 같은 위치에 같은 위치로 돌아 오게 할 수 있기를 원합니다.

그러나 나는 이미 재생 된 바이트의 수를 알 수있는 방법을 찾을 수 없었습니다. 스트리밍 된 바이트 수를 찾을 수 있습니다. 그러나 얼마나 많은 바이트가 재생되었는지 알 수 없습니다. Matt Gallagher의 오디오 스트리밍 예제를 기본으로 사용하고 있습니다.

모든 도움은 대단히 감사합니다.

감사.

해결책을 찾을 수 있습니다. AudiofilestreamSeek 설명서에 따르면

이 함수를 호출 한 후 파서는 AudioLestreamParseBytes 기능으로 전달 된 다음 데이터가 OutAbSoluteByTeOffset 매개 변수에서 반환 된 바이트 오프셋에서 시작한다고 가정합니다.

우리는 어떻게합니까? HTTP 범위 매개 변수를 사용해야합니까? 바이트 오프셋을 범위로 보내면 예상대로 작동합니까? 두 개의 스트림이 함께 재생되도록 버퍼의 기존 바이트를 어떻게 지우려면 어떻게해야합니까?

도움이 크게 감사드립니다. 감사.

도움이 되었습니까?

해결책

AudiofilestreamSeek는 바이트 수가 아닌 패킷으로 작동합니다. 따라서 실제로 추적해야 할 것은 패킷 수입니다.

Matt의 코드의 MyEnqueueBuffer 방법은 버퍼가 재생을 위해 오디오 퀘이트로 전송되는 곳입니다. 패킷이 채워지고 PacketsFilled가 0으로 재설정되기 전에 인덱스 변수를 획득하십시오.

mydata.absolutepackets = mydata.absolutepackets + mydata-> PacketsFilled;

내 문제는이 값으로도 올바르게 구현할 수 없다는 것입니다. 따라서 Matt의 코드와 함께 작업을 찾는 샘플 코드가 있으면 공유하십시오.

감사!

다른 팁

나는 이것에 대해 오디오 필 스트림 API를 실제로 시도하지 않았지만 (우리는 내부적으로 우리 자신의 굴러 갔다), 여기에 당신이 돌봐야 할 몇 가지 사항이 있습니다.

바이트 스트림을 무작위로 찾는 데 문제가 없다고 가정하면 Paul이 말한 것처럼 MP3 프레임 번호와 절대 바이트 스트림 위치 간의 관계를 계속 추적해야합니다. 나는 당신이 길을 따라 AudioFilestreamSeek에 전화하여 Audiofilestream_packetsproc에서 그렇게 할 수 있다고 가정합니다.

더 까다로운 부분이 있습니다. 임의의 추구를 할 때는 오디오 필 스트림의 내부 상태를 재설정해야합니다. 다음 수신 바이트가 현재 프레임을 완성 할 것으로 기대하는 일부 중간 상태 일 수 있기 때문입니다. 현재 프레임을 건너 뛰도록 0을 공급하고 다시 시작할 수 있는지 확실하지 않습니다. 이미 피해를 입은 프레임을 정리할 수있는 재설정 기능이 있습니다). 어쨌든 당신은 이미 추적 한 바이트 스트림의 일부를 구문 분석하기 때문에 AudioFilestream_packetsproc도 돌봐야합니다.

참고 두 번째와 비트 레이트에 의존하여 MP3 프레임의 시작을 찾을 수는 없습니다. 불변 속도 MP3 스트림이 있더라도 다른 몇 프레임마다 패딩이있을 수 있습니다. 따라서 가장 정확한 정보는 여전히 파서에서 나옵니다.

무작위 추구를하는 또 다른 방법은 단순히 길고 큰 스트림을 재생하지 않으면 구문 분석 된 패킷을 단순히 "캐시"(저장)입니다. 프레임 인덱스는 프레임 헤더 정보에서 계산할 수 있습니다. 비 VBR MP3의 경우 초당 프레임은 일정합니다 (예 : 44.1 kHz 스테레오 비 VBR MP3에 대해 SEC 당 44100/1152 = 38.28125 프레임; 왜 MP3 사양을 확인하십시오.)

원하는 장소의 MSampletime과 함께 AudioQueStart를 사용할 수 있습니까?

그냥 놀이를 멈추고 다른 샘플 시간에 시작합니까? [현재 샘플 시간을 가져 와서 필요한 것에 따라 조작하십시오.

indevicestartTime 오디오 대기열이 시작되는 시간.

관련 오디오 장치의 타임 라인에 대한 시작 시간을 지정하려면 Audiotimestamp 구조의 MSampletime 필드를 사용하십시오. NULL을 사용하여 오디오 대기열이 가능한 빨리 시작해야 함을 나타냅니다.

반환 값 결과 코드. "오디오 대기열 결과 코드"를 참조하십시오.

토론 관련 오디오 장치가 아직 실행되지 않으면이 기능이 시작됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top