2014-08-29 3 views
0

파이프 오디오 및 비디오 원시 데이터를 ffmpeg로 보내고 android에서 RTSP 프로토콜을 통해 실시간 스트림을 푸시하려고했습니다. 명령 줄 내가 오디오 코덱 비디오 코덱 및 libopus에 대한 libx264 사용하고이원시 yuv 프레임을 타임 스탬프가 포함 된 ffmpeg로 변환

"ffmpeg -re -f image2pipe -vcodec mjpeg -i "+vpipepath 
+ " -f s16le -acodec pcm_s16le -ar 8000 -ac 1 -i - " 
+ " -vcodec libx264 " 
+ " -preset slow -pix_fmt yuv420p -crf 30 -s 160x120 -r 6 -tune film " 
+ " -g 6 -keyint_min 6 -bf 16 -b_strategy 1 " 
+ " -acodec libopus -ac 1 -ar 48000 -b:a 80k -vbr on -frame_duration 20 " 
+ " -compression_level 10 -application voip -packet_loss 20 " 
+ " -f rtsp rtsp://remote-rtsp-server/live.sdp"; 

모습이다. yuv 프레임은 mkfifo에 의해 생성 된 명명 된 파이프를 통해 공급되며, pcm 프레임은 stdin을 통해 공급됩니다.

작동하며 재생하여 스트림을 가져 와서 재생할 수 있습니다. 하지만 오디오/비디오 동기화 문제가 있습니다. 오디오는 비디오보다 5 ~ 10 초 늦습니다. 문제는 yuv 프레임과 pcm 프레임 모두에 타임 스탬프가 없다는 것입니다. FFmpeg는 데이터 피드와 함께 타임 스탬프를 추가합니다. 오디오/비디오 캡처 스레드는 동일한 속도로 실행될 수 없습니다. 각 원시 데이터 프레임에 타임 스탬프를 추가 할 수 있습니까? 그래서 당신이 할 필요가 그들을 먹이이다,는 FFmpeg가 추가 Android Camera Capture using FFmpeg

답변

0

그것이 파이프에서 샘플을 검색하는 순간 타임 스탬프 (? PST/DST 같은)

내가 사용하는 방법은이 스레드에서했다 동조. 귀하의 경우에는 오디오 버퍼가 이미 있으며 실시간으로 비디오 프레임을 제공하고있는 것이 좋습니다. 그것은 오디오를 늦게 만듭니다. 오디오를 버퍼링하는 것과 동일한 시간으로 비디오 프레임을 버퍼링해야합니다. 오디오 버퍼 크기를 제어 할 수 없다면 가능한 한 작게 유지하고 크기를 모니터링하고 적절하게 비디오 버퍼링을 조정하십시오.

+1

xx하지만 마침내 나는 비디오/오디오를 이런 식으로 동기화 할 수 없다는 것을 알았습니다. 코딩을 통해 수동으로 타임 스탬프를 추가해야합니다. –

+0

다른 사람들을 위해 관심있는 방법 : 내 대답에서 설명하는 것은 완벽하게 작동합니다 (내 코드에서 사용함). 물론 OP의 경로를 따르고 대신 API를 사용할 수 있습니다. –