2014-02-03 4 views
3

Я использую 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, но я не могу найти решение.

Я потратил немало времени, пытаясь решить эту неприятную проблему, но пока не добился успеха. Любая помощь действительно ценится !!!

ответ

0

У меня такая же проблема с использованием этой библиотеки. В моем случае я пытался воспроизвести поток DVB, перенаправленный по сети. Поток в реальном времени и когда-то (из-за сетевых проблем или по другим причинам) некоторые пакеты могут быть пропущены или повреждены, а библиотека перестает играть.

Чтобы заставить его работать, я сделал еще 2 исправления в дополнение к «исправлению времени начала видео» (патч в вашем сообщении).

Первый отключить «остановить поток при неудаче декодирования»:

@@ -1112,7 +1127,7 @@ 
      av_free_packet(packet_data->packet); 
     } 
     queue_pop_finish(queue, &player->mutex_queue, &player->cond_queue); 
-  if (err < 0) { 
+  if (!player->is_live_stream && err < 0) { 
      pthread_mutex_lock(&player->mutex_queue); 
      goto stop; 
     } 

Второй является отключить регулировку PTS для кадров, которые прибывают слишком поздно (в живом потоке, мы должны бросить их):

@@ -738,7 +741,19 @@ 
       "player_wait_for_frame[%d] Waiting for frame: sleeping: %" SCNd64, 
       stream_no, sleep_time); 

-  if (sleep_time < -300000ll) { 
+  if (player->is_live_stream && sleep_time < -1000000ll) { 
+   // 1000 ms late 
+   int64_t new_value = player->start_time - sleep_time; 
+ 
+   LOGI(4, 
+     "player_wait_for_frame[%d] skipping frame because too late", 
+     stream_no); 
+ 
+   ret = WAIT_FUNC_RET_SKIP; 
+   break; 
+  } 
+ 
+  if (sleep_time < -300000ll) { 
      // 300 ms late 
      int64_t new_value = player->start_time - sleep_time; 

«player-> is_live_stream» является INT 0/1, я установить в 1, когда я играю в живой поток, так и для других видов источников библиотека по-прежнему работать, как и раньше.

Надеюсь, это может вам помочь :)

Смежные вопросы