저는 비디오와 오디오를 결합하고 둘 사이의 정확한 동기화가 필요한 다수의 플레이어 응용 프로그램 (Windows 용)을 작성했습니다. Windows 오디오에서는 기본적으로 오디오 샘플 값의 배열 인 버퍼를 준비하고 재생을 위해 오디오 하위 시스템에 대기시킵니다. 서브 시스템은 각 버퍼가 재생을 완료 할 때마다 앱에 콜백을 만들고 앱은 각 콜백을 사용하여 다음 프레임을 화면에 렌더링하고 2) 오디오 하위 시스템에 대기 할 다음 오디오 청크를 준비합니다.
예를 들어, 초당 50 프레임, 모노, 2 바이트 샘플 및 44,100 샘플/초의 오디오와 동기화하여 비디오의 일부 프레임이 메모리에 있다고 가정 해 봅시다. 즉, 오디오 버퍼의 크기는 각각 882 샘플 (44,100/50 = 882)이어야하므로 각 버퍼는 882 개 요소의 짧은 (2 바이트) 정수 배열입니다. 적어도 두 개의 버퍼가 필요하지만 실제로는 더 좋습니다. 버퍼가 많으면 많을수록 재생 지연이 길어지고 메모리 공간이 커진다는 단점이 있습니다.
적어도 하나의 프레임을 항상 렌더링 할 준비가되도록 동일한 방식으로 비디오 프레임을 "버퍼링"해야합니다. 하나의 이미지를 PC 화면으로 전송하는 속도가 너무 빨라 사실상 순간적으로 걱정할 필요가 없습니다. 유일한 관심사는 프레임을 추출하거나 합성하는 모든 방법에 있습니다. 이러한 방법은 재생 속도를 따라 잡을 수있을만큼 빨라야하거나 재생 전에 미리 버퍼링해야하기 때문에 시작 지연이 길어지고 메모리 공간이 커집니다 (이러한 문제는 비디오보다 훨씬 나쁩니다. 그들은 합리적인 해결책으로 오디오 용입니다).
앱이 재생을 시작하면 모든 버퍼에 오디오가 사전로드되고 재생을 위해 대기합니다. 그런 다음 동시에 재생을 시작하고 첫 번째 프레임을 화면에 렌더링합니다. 사용자는 첫 번째 프레임을보고 오디오의 처음 20ms (20ms = 1/50 초)를 듣습니다.이 시점에서 오디오 하위 시스템은 첫 번째 버퍼에서 두 번째 버퍼로 재생을 전환하고 응용 프로그램에 대한 콜백을 수행합니다. 그런 다음 응용 프로그램은 두 번째 프레임을 화면에 렌더링하고 첫 번째 버퍼를 사용 가능한 다음 청크로 채운 다음이 첫 번째 버퍼를 다시 오디오 하위 시스템에 대기시킵니다.
응용 프로그램에서 버퍼 및 프레임을 채우는 데 사용할 수있는 오디오 및 비디오 데이터가있는 경우이 프로세스가 계속되고 비디오를 보거나들을 수 있습니다.
VLC는 오픈 소스가 아닙니까? 당신은 그것을 확인할 수 있었다 :) –
나는 방금 포켓 PC에 mpeg lib로 어떻게 그것을했는지 기억했다. 그리고 그것은 당신이 묘사 한 것과 같았습니다. 2D 라이브러리를 사용하여 서페이스를 열고 프레임 비트를 서페이스로 복사 한 다음 화면에 뒤집습니다. 이제 당장 두 개의 프레임을 버퍼링하거나 프레임간에 보간하는 것과 같은 깔끔한 작업을 수행 할 수 있습니다. 그러나 나는이 시점에서 화면에 픽셀을 가져 오는 것보다 훨씬 더 많은 마법이 있다고 생각하지 않습니다. – dowhilefor
이미지를 그려 오디오 데이터를 오디오 - 비디오 시간 동기화와 함께 넣습니다. – 9dan