android+ffmpeg 解码264视频流

血色天坑 2015-08-27 05:36:58
最近在做视频传输,PC与PC端在局域网内传输已经实现,即一台电脑连接一个工业相机,将相机拍摄的视频实时编码(使用x264库)然后RTP封包发送,另一台电脑进行接收使用ffmpeg解码并显示,效果还可以。
现在想要将接收端换成Android手机,如法炮制,发送端还是PC没有变,接收端需要将ffmpeg移植到Android上,通过参考资料http://blog.csdn.net/gobitan/article/details/22750719 我成功生成了相应so库,并使用jni技术,在Android手机上实现了对手机本地.264文件的解码显示,一切顺利。下面问题来了:
现在我想要用手机读取网络端口过来的视频流数据并解码显示,采用之前PC-PC传输的方法,我让它通过读取sdp文件来读取网络端口的流数据,test.sdp内容如下所示,
v=0
o=- 0 0 IN IP4 192.168.1.10
s=No Name
c=IN IP4 192.168.1.18
t=0 0
a=tool:libavformat 55.37.102
m=video 6666 RTP/AVP 96
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1
我的sdp文件中没有给出sps和pps的编码值,不过我在发送端编码发送的时候每隔一段时间就会发送一次sps和pps所以我之前PC-PC传输成功了,可是这次,直接在avformat_open_input()的时候就返回-1094995529,我查了下这是AVERROR_INVALIDDATA的值,求指点!
分析:是我编译ffmpeg的时候出了问题了吗?我已经注意编译的时候开启了network、rtsp、sdp等功能了啊,附上我的.sh文件,如下
#!/bin/bash
NDK=D:/NDK/android-ndk-r10d
SYSROOT=$NDK/platforms/android-9/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64
function build_one {
./configure \
--prefix=$PREFIX \
--enable-shared \
--disable-static \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-avdevice \
--disable-doc \
--disable-symver \
--enable-network \
--enable-demuxer=rtsp \
--enable-demuxer=sdp \
--enable-protocols \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--target-os=linux \
--arch=arm \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
}
CPU=arm
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS="-marm"
build_one
求指点,深表感谢!!
...全文
1143 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
ningjun0871 2017-11-01
  • 打赏
  • 举报
回复
哥,你的android Demo能否给我一个?464946892@qq.com谢谢
血色天坑 2016-03-11
  • 打赏
  • 举报
回复
分数我就随便给了,结贴了~
血色天坑 2016-03-11
  • 打赏
  • 举报
回复
补充:我用的手机是Nexus5X,之前用的联想K860i不行。
血色天坑 2016-03-11
  • 打赏
  • 举报
回复
最终我放弃了使用ffmpeg进行软解的方案,采用了AndroidSDK中的硬解码方案;软解消耗cpu会导致手机发热,硬解cpu消耗低不过对于手机硬件有要求,要求手机配置至少是高通晓龙800以后的芯片,AndroidSDK至少是API16之后的版本。GitHub上有参考代码,实测可用,链接如下: https://github.com/ekumenlabs/AndroidStreamingClient 大家可以试一下。
梁轶凡 2015-12-18
  • 打赏
  • 举报
回复
别人正在发愁,哪有时间帮你
coderTing 2015-12-18
  • 打赏
  • 举报
回复
你好,我最近也打算做这东西,但不知道怎么入手,可以帮帮我吗?我QQ:421329605.谢谢
血色天坑 2015-09-18
  • 打赏
  • 举报
回复
这个问题应该不是由于ffmpeg库编译造成的,应该是编码格式的问题,Windows下默认使用的文本编码格式是ANSI,我把这个格式的sdp文件拷贝到Android手机上Android不认识,我使用UltraEdit将文本另存为Unicode-littleendian含BOM格式后拷贝到Android手机上Avformat_open_input()返回值正确了,其它格式例如Unicode-bigendian、utf-8带BOM或不带BOM都导致Avformat_open_input()返回-1094995529;不明白为什么。 现在问题仍没有解决,因为虽然这个Avformat_open_input()返回没问题了,但是下一步avformat_find_stream_info()的时候返回AVERROR_EOF;我使用tcpdump抓包,发现手机对应的网络端口是由正确的网络数据包的;因此推断是编码格式问题的可能性很大,希望能给大家有所帮助,一步一步找到解决方案。
changs_roid 2015-09-06
  • 打赏
  • 举报
回复
也在这块。有没有好办法
jeky_zhang2013 2015-08-30
  • 打赏
  • 举报
回复
还没研究过,帮顶下,看看输出的日志异常是什么
翔云123456 2015-08-30
  • 打赏
  • 举报
回复
返回错误值是啥意思,为什么会出现,先搞清这个比较好
line_us 2015-08-30
  • 打赏
  • 举报
回复
看看解决方法,
血色天坑 2015-08-29
  • 打赏
  • 举报
回复
google相关问题解决方案,结果搜到了自己的提问,好心酸。。。
小菜鸟2015 2015-08-28
  • 打赏
  • 举报
回复
帮顶,我现在也在做这种,还在学习中
血色天坑 2015-08-27
  • 打赏
  • 举报
回复
自己顶一个。。。

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧