| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5601 人关注过本帖
标题:基于 ffmpeg 编写的 ffplayer 播放器
只看楼主 加入收藏
RockCarry
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:13
帖 子:662
专家分:58
注 册:2005-8-5
收藏
得分:0 
up
2016-08-17 11:29
RockCarry
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:13
帖 子:662
专家分:58
注 册:2005-8-5
收藏
得分:0 
up
2016-08-17 11:32
RockCarry
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:13
帖 子:662
专家分:58
注 册:2005-8-5
收藏
得分:0 
顶不上去?
2016-08-17 11:33
newbid
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2016-9-1
收藏
得分:0 
回复 楼主 RockCarry
android的jni你是怎么编译的?看了你的源码使用了#include <android_runtime/AndroidRuntime.h>
#include <android_runtime/android_view_Surface.h>,这些都是ndk里面没有的,只有android源码才有呀
2016-09-01 10:26
RockCarry
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:13
帖 子:662
专家分:58
注 册:2005-8-5
收藏
得分:0 
回复 14楼 newbid
对的,我是在 android 源代码下编译的
另外 android 版本的 ffplayer 近期都没更新,近期主要精力还是在完善 windows 版本。
2016-09-13 13:44
yxfangcs
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2017-5-3
收藏
得分:0 
楼主你好,我刚学ffmpeg,对于你的代码我仔细看过并运行测试了,发现几个问题,
1.player_seek之后,视频会突然播放变快一小段时间,基本上所有视频都有这个现象。
2.player_seek之后会先快一段时间,然后帧率就逐渐变慢,就像逐帧播放一样
3.如果用VDEV_RENDER_TYPE_D3D模式,有时候会出现只播了第一帧,然后就播不了,用VDEV_RENDER_TYPE_GDI则正常。
4.设置播放速度超过100,好像没什么用。
以上2,3,4出现的情况都是使用的1080p无声音的MP4格式进行测试发生的。用带声音的mp4播放都是正常的,我怀疑是不是跟这个有关。

我尝试解决过,但是没成功

楼主代码写得很好,学习了。
联系邮箱:yxfangcs@

[此贴子已经被作者于2017-5-3 17:15编辑过]

2017-05-03 16:28
yxfangcs
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2017-5-3
收藏
得分:0 
回复 16楼 yxfangcs
已经被我找到问题所在,在此说一下,

问题的根源在于,对于没有音频的视频文件,代码中没有进行判断。
在palyer_seek 函数中调用了render_setparam来设置position
        render_setparam(player->render, PARAM_MEDIA_POSITION, &ms);
在该函数里有下面的代码
        if (render->adev && *papts != -1) *papts = *(int64_t*)param;
        if (render->vdev && *pvpts != -1) *pvpts = *(int64_t*)param;
意思就是把音频和视频的pts都设置成外部传进来的postion,在vdev-gdi.cpp的VideoRenderThreadProc线程函数里
作者添加了一些同步音频和视频的代码,用到了这边设置的apts,从大概100行开始
         if (apts != -1 && vpts != -1) {
                if (apts - vpts > c->tickavdiff + 5) c->ticksleep-=2;
                if (apts - vpts < c->tickavdiff - 5) c->ticksleep+=2;
          }
          if (c->ticksleep > 0) Sleep(c->ticksleep);
代码很好理解,视频在等音频同步,导致的问题就是sleep时间被无限+2,然后越播越慢。
当然还有d3d的错误也一样的。

临时的解决方法就是把palyer_seek 函数中调用的render_setparam注了,
更好的就是对只有视频或只有音频的文件做出判断,也减少了相关资源的创建。

剩下的问题等我有时间再看看。

[此贴子已经被作者于2017-5-6 17:27编辑过]

2017-05-06 17:16
yxfangcs
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2017-5-3
收藏
得分:0 
回复 17楼 yxfangcs
昨天晚上把问题4的看了一下,原因非常简单

作者只在render_audio线程里添加了对speed的设置,
            if (render->render_speed_cur != render->render_speed_new) {
                render->render_speed_cur = render->render_speed_new;
没有音频的时候,设置speed当然是无效的,

解决办法就是在render_video线程里添加上面的代码。可在
     vdev_request(render->vdev, (void**)&bmpbuf, &stride);
的上面一行添加,当然还要考虑到两个线程对同一个变量的写操作的互斥问题。
不考虑的话问题也不大。
2017-05-10 12:28
yxfangcs
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2017-5-3
收藏
得分:0 
回复 17楼 yxfangcs
昨天晚上把问题4的看了一下,原因非常简单

作者只在render_audio线程里添加了对speed的设置,
            if (render->render_speed_cur != render->render_speed_new) {
                render->render_speed_cur = render->render_speed_new;
没有音频的时候,设置speed当然是无效的,

解决办法就是在render_video线程里添加上面的代码。可在
     vdev_request(render->vdev, (void**)&bmpbuf, &stride);
的上面一行添加,当然还要考虑到两个线程对同一个变量的写操作的互斥问题。
不考虑的话问题也不大。
2017-05-10 12:29
快速回复:基于 ffmpeg 编写的 ffplayer 播放器
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017944 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved