파이프 오디오 및 비디오 원시 데이터를 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
xx하지만 마침내 나는 비디오/오디오를 이런 식으로 동기화 할 수 없다는 것을 알았습니다. 코딩을 통해 수동으로 타임 스탬프를 추가해야합니다. –
다른 사람들을 위해 관심있는 방법 : 내 대답에서 설명하는 것은 완벽하게 작동합니다 (내 코드에서 사용함). 물론 OP의 경로를 따르고 대신 API를 사용할 수 있습니다. –