Я использую FFMPEG построенный из AppUnite с последним патчем для stagefright поддержки в целях воспроизведения HTTP трансляции: https://review.appunite.com/#/c/1779/HLS Проблемы воспроизведения на Android с FFMPEG
Поскольку поток не начинается с 0, я добавил следующий код, чтобы избежать черного экрана:
struct Player {
+ int64_t video_start_time;
}
void player_get_video_duration(struct Player *player) {
+ player->video_start_time = 0;
+ for (i = 0; i < player->capture_streams_no; ++i) {
+ AVStream *stream = player->input_streams[i];
+ if (stream->start_time > 0) {
+ player->video_start_time = av_rescale_q(
+ stream->start_time, stream->time_base, AV_TIME_BASE_Q);
+
+ LOGI(3, "player_set_data_source stream[%d] start_time: %ld",
+ i, player->video_start_time);
+
+ break;
+ }
+ }
}
enum WaitFuncRet player_wait_for_frame(
struct Player *player, double time, int stream_no) {
- int64_t current_time = av_gettime();
+ int64_t current_time = av_gettime() + player->video_start_time;
}
Однако, как только sleep_time в player_wait_for_frame опускается ниже 0, замерзает воспроизведения, а затем вешает ждет кадр, который никогда не приходит. Очереди, выделенные функцией player_alloc_queues, кажутся недостаточно большими, чтобы удерживать поток в реальном времени, находящийся между player_open_input и player_start_decoding_threads. Однако увеличение количества узлов в очереди не решает проблему. Проблема явно проявляется в методе player_wait_for_frame, но я не могу найти решение.
Я потратил немало времени, пытаясь решить эту неприятную проблему, но пока не добился успеха. Любая помощь действительно ценится !!!