【发布时间】:2014-02-26 19:51:04
【问题描述】:
我正在使用由 AppUnite 构建的 FFMPEG 和最新补丁来支持舞台表演,以便播放 http 实时流:https://review.appunite.com/#/c/1779/
由于流不是从 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;
}
但是,一旦 player_wait_for_frame 中的 sleep_time 降到 0 以下,播放就会冻结,然后挂起等待永远不会到达的帧。 player_alloc_queues 函数分配的队列似乎不足以容纳在 player_open_input 和 player_start_decoding_threads 之间推送的实时流。然而,增加队列中的节点数量并不能解决问题。问题似乎显然在 player_wait_for_frame 方法中,但我无法找到解决方案。
我花了很多时间试图解决这个令人讨厌的问题,但到目前为止还没有成功。任何帮助都非常感谢!!!
【问题讨论】:
标签: android ffmpeg http-live-streaming