我在Android上编译了FFmpeg(libffmpeg.so).现在我必须构建像RockPlayer这样的应用程序或使用现有的Android多媒体框架来调用FFmpeg.
你有关于在Android/StageFright上集成FFmpeg的步骤/程序/代码/示例吗?
您能否指导我如何使用此库进行多媒体播放?
我有一个要求,我已经有音频和视频传输流,我需要将其提供给FFmpeg并进行解码/渲染.我怎么能在Android上这样做,因为IOMX API是基于OMX的,不能在这里插入FFmpeg?
另外,我找不到需要用于播放的FFmpeg API的文档.
我需要为研究项目进行硬件加速的H.264解码,以测试自定义协议.
正如我在网上搜索一样,我发现了一些在Android上执行硬件加速视频解码的方法.
有些人"说" libstagefright是高通球员明显取得成功的唯一途径.
目前我不确定哪种方式可行.我现在有点困惑.如果一切正常,我当然更喜欢硬件无关的方法.
由于我用Galaxy Tab 7.7(3.2和Enxyos),VLC,Mobo,Rock,vplayer,rock和mobo测试了几个视频播放器的H/W加速度,VLC无法正常工作,vplayer似乎有渲染花费其性能的bug.
无论如何,我在Rockplayer上做了一个'操作'并删除了data\data\com.redirecting\rockplayer中的所有.so库,软件解码崩溃了,而hw解码工作仍然很好!我想知道他们是怎么做到的.在我看来,hw加速可以独立于硬件平台.
有人可以解决这个问题吗?或者提供任何参考资料或更多细节?
我需要在没有MediaExtractor的情况下使用MediaCodec,我正在使用FileInputStream读取文件.目前它不工作,它在屏幕上显示绿色的乱码图像.
这是完整的源代码:
FileInputStream in = new FileInputStream("/sdcard/sample.ts");
String mimeType = "video/avc";
MediaCodec decoder = MediaCodec.createDecoderByType(mimeType);
MediaFormat format = MediaFormat.createVideoFormat(mimeType, 1920, 1080);
byte[] header_sps = { 0, 0, 0, 1, 103, 100, 0, 40, -84, 52, -59, 1, -32, 17, 31, 120, 11, 80, 16, 16, 31, 0, 0, 3, 3, -23, 0, 0, -22, 96, -108 };
byte[] header_pps = { 0, 0, 0, 1, 104, -18, 60, -128 };
format.setByteBuffer("csd-0", ByteBuffer.wrap(header_sps));
format.setByteBuffer("csd-1", ByteBuffer.wrap(header_pps));
format.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, 1920 * 1080);
format.setInteger("durationUs", 63446722); …Run Code Online (Sandbox Code Playgroud) 有没有解释android Stagefright架构的文档?
我可以就这些主题得到一些指示吗?
我目前正在开发一种应用程序,它需要记录音频,将其编码为AAC,对其进行流式传输,并在反向中执行相同的操作 - 接收流,解码AAC和播放音频.
我使用MediaRecorder成功录制了AAC(包装在MP4容器中),并使用AudioRecord类成功上传了音频.但是,我需要能够在流式传输时对音频进行编码,但这些类似乎都没有帮助我这样做.
我研究了一下,发现大多数有这个问题的人最终都使用像ffmpeg这样的本地库.
但我想知道,因为Android已经包含StageFright,它具有可以进行编码和解码的本机代码(例如,AAC编码和AAC解码),有没有办法在我的应用程序上使用这些本机代码?我怎样才能做到这一点?
如果我只需要用他们的本机代码实现一些JNI类,那就太好了.另外,因为它是一个Android库,所以不会出现许可问题(如果我错了,请纠正我).
我想在Android设备上显示H.264编码的rtsp视频.该流来自Raspberry Pi,使用vlc编码/dev/video1,这是一个"Pi NoIR相机板".
vlc-wrapper -vvv v4l2:///dev/video1 --v4l2-width $WIDTH --v4l2-height $HEIGHT --v4l2-fps ${FPS}.0 --v4l2-chroma h264 --no-audio --no-osd --sout "#rtp{sdp=rtsp://:8000/pi.sdp}" :demux=h264 > /tmp/vlc-wrapper.log 2>&1
Run Code Online (Sandbox Code Playgroud)
我现在正在使用非常少的Android代码:
final MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setDisplay(holder);
try {
mediaPlayer.setDataSource(url);
mediaPlayer.prepare();
Run Code Online (Sandbox Code Playgroud)
并获得"准备失败:状态= 0x1" IOException.当我查看日志时,我会看到类似的行
06-02 16:28:05.566 W/APacketSource( 316): Format:video 0 RTP/AVP 96 / MIME-Type:H264/90000
06-02 16:28:05.566 W/MyHandler( 316): Unsupported format. Ignoring track #1.
06-02 16:28:05.566 I/MyHandler( 316): SETUP(1) completed with result -1010 (Unknown error 1010)
Run Code Online (Sandbox Code Playgroud)
来自系统过程.Grepping这些消息指向 libstagefright/rtsp源,似乎意味着构造函数中的ASessionDescription::getDimensions调用APacketSource::APacketSource失败.这似乎不应该发生,因为VLC肯定知道要输出的维度: …
大家:我是ffmpeg的新手.最近我正在研究将ffmpeg移植到android设备的项目.一开始,我按照互联网上的一些指南以非常正常的方式将ffmpeg编译为共享库(.so文件),将它们加载到我的Android应用程序中.它完美地运作.
现在我希望ffmpeg使用libstagefright来实现硬件解码.问题是,我可以编译.so库,但是当我启动我的应用并加载那些.so库时,总会有一个java.lang.UnsatisfiedLinkError:无法加载库:reloc_library [1314]:114找不到'_ZN7android11MediaBufferC1Ej'
我在那里呆了几天.有没有人遇到过类似的问题?如果有人能给我一些关于这个错误的提示,那就太好了.
我的步骤:1.将ffmpeg-2.1.4源代码编译为.so共享库.我使用build_libstagefright脚本执行此操作,并根据Internet的某些指南进行一些修改.
#!/bin/bash
#export NDK=/home/mingzhang/android/android-ndk-r9c
export NDK=/home/mingzhang/android/android-ndk-r7
if [ "$NDK" = "" ]; then
echo NDK variable not set, assuming ${HOME}/android-ndk
export NDK=${HOME}/android-ndk
fi
echo "Fetching Android system headers"
git clone --depth=1 --branch gingerbread-release git://github.com/CyanogenMod/android_frameworks_base.git ../android-source/frameworks/base
git clone --depth=1 --branch gingerbread-release git://github.com/CyanogenMod/android_frameworks_av.git ../android-source/frameworks/av
git clone --depth=1 --branch gingerbread-release git://github.com/CyanogenMod/android_frameworks_native.git ../android-source/frameworks/native
git clone --depth=1 --branch gingerbread-release git://github.com/CyanogenMod/android_hardware_libhardware.git ../android-source/hardware/libhardware
git clone --depth=1 --branch gingerbread-release git://github.com/CyanogenMod/android_system_core.git ../android-source/system/core
echo "Fetching Android libraries for linking"
# Libraries from any froyo/gingerbread device/emulator should …Run Code Online (Sandbox Code Playgroud) 我必须修改Android Media Player的Http Live Streaming实现.该实现在stagefright库 http://androidxref.com/4.0.4/xref/frameworks/base/media/libstagefright/httplive/LiveDataSource.cpp下
我认为这些库将编译为libstagefright.so,它应该是Android系统的一部分.
我的问题是,如果我对这个库进行一些更改并编译一个新的libstagefright.so.如果我在我的新应用程序中加载这个新的libstagefright.so并调用媒体播放器,它是否会使用我的新libstagefright.so中的代码?
最近我已经成功地将视频解码器移植到了android.还将输出转储到surfaceview上并使用本机API检查输出.现在,下一个任务是实现播放,暂停,流媒体等,即媒体播放器的其他功能.这样做将是一个返工,因为所有这些功能已经在android多媒体框架中定义.我听说我们可以将解码器作为插件,并将其集成到Android的多媒体框架中.虽然我用谷歌搜索相同的,我几乎找不到任何关于相同的信息.所以我请求任何读者为上述问题提出一些相关链接或解决方案.提前致谢,等待您的回复.
android android-ndk android-framework stagefright android-mediaplayer
我试图了解MediaCodec如何用于硬件解码.
我在android内部的知识非常有限.
以下是我的发现:
有一个xml文件,代表android系统中的编解码器细节.
device/ti/omap3evm/media_codecs.xml for an example.
Run Code Online (Sandbox Code Playgroud)
这意味着,如果我们使用Media Codec从Java Application创建编解码器
MediaCodec codec = MediaCodec.createDecoderByType(type);
Run Code Online (Sandbox Code Playgroud)
应该在xml文件的帮助下找出各自的编码器.
我在做什么?
我试图找出代码的哪一部分正在读取xml并根据给定的'type'找到编解码器.
1)应用层:
MediaCodec codec = MediaCodec.createDecoderByType(type);
Run Code Online (Sandbox Code Playgroud)
2)MediaCodec.java - > [ frameworks/base/media/java/android/media/MediaCodec.java ]
public static MediaCodec createDecoderByType(String type) {
return new MediaCodec(type, true /* nameIsType */, false /* encoder */);
}
Run Code Online (Sandbox Code Playgroud)
3)
private MediaCodec(
String name, boolean nameIsType, boolean encoder) {
native_setup(name, nameIsType, encoder); --> JNI Call.
}
Run Code Online (Sandbox Code Playgroud)
4)JNI实现 - > [ frameworks/base/media/jni/android_media_MediaCodec.cpp ]
static void android_media_MediaCodec_native_setup (..) {
.......
const char *tmp = …Run Code Online (Sandbox Code Playgroud) android ×10
stagefright ×10
android-ndk ×3
h.264 ×3
ffmpeg ×2
video ×2
aac ×1
mediacodec ×1
native ×1
opencore ×1
openmax ×1
stream ×1