- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想在 WebView 中加载 .flv 视频。
我已经从this link获得了帮助,但问题是我无法在模拟器中观看视频。
这是我的代码:
package com.FlvTester;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebView;
import android.widget.FrameLayout;
public class FlvTester extends Activity {
WebView webView;
String htmlPre = "<!DOCTYPE html><html lang=\"en\"><head><meta charset=\"utf-8\"></head><body style='margin:0; pading:0; background-color: black;'>";
String htmlCode =
" <embed style='width:100%; height:100%' src='http://www.platipus.nl/flvplayer/download/1.0/FLVPlayer.swf?fullscreen=true&video=@VIDEO@' " +
" autoplay='true' " +
" quality='high' bgcolor='#000000' " +
" name='VideoPlayer' align='middle'" + // width='640' height='480'
" allowScriptAccess='*' allowFullScreen='true'" +
" type='application/x-shockwave-flash' " +
" pluginspage='http://www.macromedia.com/go/getflashplayer' />" +
"";
String htmlPost = "</body></html>";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
webView = (WebView)findViewById(R.id.webview);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setAllowFileAccess(true);
webView.getSettings().setPluginsEnabled(true);
htmlCode = htmlCode.replaceAll("@VIDEO@", "file:///android_asset/expression_sad.flv");
webView.loadDataWithBaseURL("file:///android_asset/expression_sad.flv", htmlPre+htmlCode+htmlPost, "text/html", "UTF-8", null);
}
@Override
protected void onPause(){
super.onPause();
callHiddenWebViewMethod("onPause");
webView.pauseTimers();
if(isFinishing()){
webView.loadUrl("about:blank");
setContentView(new FrameLayout(this));
}
}
@Override
protected void onResume(){
super.onResume();
callHiddenWebViewMethod("onResume");
webView.resumeTimers();
}
private void callHiddenWebViewMethod(String name){
// credits: http://stackoverflow.com/questions/3431351/how-do-i-pause-flash- content-in-an-android-webview-when-my-activity-isnt-visible
if( webView != null ){
try {
Method method = WebView.class.getMethod(name);
method.invoke(webView);
} catch (NoSuchMethodException e) {
//Lo.g("No such method: " + name + e);
} catch (IllegalAccessException e) {
//Lo.g("Illegal Access: " + name + e);
} catch (InvocationTargetException e) {
//Lo.g("Invocation Target Exception: " + name + e);
}
}
}
}
我在 log cat 中遇到了这个错误
07-06 12:00:48.567: WARN/dalvikvm(381): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
07-06 12:00:48.597: ERROR/AndroidRuntime(381): FATAL EXCEPTION: main
07-06 12:00:48.597: ERROR/AndroidRuntime(381): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.FlvTester/com.FlvTester.FlvTester}: java.lang.ClassCastException: android.widget.VideoView
07-06 12:00:48.597: ERROR/AndroidRuntime(381): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
07-06 12:00:48.597: ERROR/AndroidRuntime(381): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
07-06 12:00:48.597: ERROR/AndroidRuntime(381): at android.app.ActivityThread.access$2300(ActivityThread.java:125)
07-06 12:00:48.597: ERROR/AndroidRuntime(381): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
07-06 12:00:48.597: ERROR/AndroidRuntime(381): at android.os.Handler.dispatchMessage(Handler.java:99)
07-06 12:00:48.597: ERROR/AndroidRuntime(381): at android.os.Looper.loop(Looper.java:123)
07-06 12:00:48.597: ERROR/AndroidRuntime(381): at android.app.ActivityThread.main(ActivityThread.java:4627)
07-06 12:00:48.597: ERROR/AndroidRuntime(381): at java.lang.reflect.Method.invokeNative(Native Method)
07-06 12:00:48.597: ERROR/AndroidRuntime(381): at java.lang.reflect.Method.invoke(Method.java:521)
07-06 12:00:48.597: ERROR/AndroidRuntime(381): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
07-06 12:00:48.597: ERROR/AndroidRuntime(381): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
07-06 12:00:48.597: ERROR/AndroidRuntime(381): at dalvik.system.NativeStart.main(Native Method)
07-06 12:00:48.597: ERROR/AndroidRuntime(381): Caused by: java.lang.ClassCastException: android.widget.VideoView
07-06 12:00:48.597: ERROR/AndroidRuntime(381): at com.FlvTester.FlvTester.onCreate(FlvTester.java:31)
07-06 12:00:48.597: ERROR/AndroidRuntime(381): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
07-06 12:00:48.597: ERROR/AndroidRuntime(381): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
07-06 12:00:48.597: ERROR/AndroidRuntime(381): ... 11 more
主.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android">
<WebView android:layout_width="match_parent" android:id="@+id/webview" android:layout_height="match_parent"></WebView>
</LinearLayout>
更新
最佳答案
您没有明确说明您的 Android 版本,但我可以确认 flash 插件确实加载并且电影播放器确实嵌入了漩涡形状的图形。我可以让它进入全屏模式。我也可以播放在线视频,但不能播放应用程序 Assets 文件夹中的视频,但我有一个解决方法。
您的 manifest.xml 中需要以下权限:
<uses-permission android:name="android.permission.INTERNET"></uses-permission> <!-- where required -->
<uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission>
有趣的是,我发现我只能在静态加载 html 时从 Assets 文件夹运行 SWF 播放器,即当我创建一个 html 文件并使用 loadUrl() 直接从 Assets 文件夹加载它时。当使用 loadDataBaseUrl 方法加载 html 数据时,似乎有一些东西阻止了对应用程序目录的访问。
要成功地从本地设备播放视频,静态 html 文件和视频必须位于 sdcard 上。我唯一的结论是,出于安全原因, Assets 文件夹对嵌入式插件是禁止访问的。
if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
Log.d(TAG, "No SDCARD");
} else {
webView.loadUrl("file://"+Environment.getExternalStorageDirectory()+"/FLVplayer/index.html");
}
这是html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
</head>
<body style="margin:0; pading:0; background-color: black;">
<embed
style="width:100%; height:100%"
src="./FLVPlayer.swf?fullscreen=true&video=./expression_sad.flv"
autoplay="true"
quality="high"
bgcolor="#000000"
name="VideoPlayer"
align="middle"
allowScriptAccess="*"
allowFullScreen="true"
type="application/x-shockwave-flash"
pluginspage="http://www.macromedia.com/go/getflashplayer">
</embed>
</body>
</html>
这是一个 100% 有效的解决方案,但在调用 loadUrl 以动态替换视频文件名之前,您必须将 html 文件写入 sdcard。此外,您应该将 Assets 文件夹中的视频复制到 SD 卡上的相同路径中(正如您从我的例子中看到的那样,我创建了一个名为 FLVplayer 的文件夹。
在运行 Froyo(2.2) 的 Samsung Galaxy Tab 上进行的测试
更新
我包括了一个已经过测试和工作的完整 Activity 。这需要将 Flash 播放器、FLV 文件和 index.html 文件的副本放置在 SD 卡根目录下名为“FLVplayer”的文件夹中,您可以使用文件资源管理器复制该文件夹。您可以编辑各种实用程序函数来修改从 Assets 文件夹复制文件的行为
package com.FLVplayer;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import android.app.Activity;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.webkit.WebView;
import android.widget.FrameLayout;
public class FLVplayerActivity extends Activity {
private static final String TAG="FLVplayer";
private static WebView webView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
webView = (WebView)findViewById(R.id.webview);
//WebView webview = new WebView(this);
//setContentView(webview);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setAllowFileAccess(true);
webView.getSettings().setPluginsEnabled(true);
if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
Log.d(TAG, "No SDCARD");
} else {
//prepare the directory
File flvDirectory = new File(Environment.getExternalStorageDirectory(),"FLVplayer");
if(!flvDirectory.exists())
try {
flvDirectory.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
//specify the html file name to use
File flvHtml = new File(flvDirectory,"index.html");
//copy what you need
copySwfAsset(flvDirectory, "FLVPlayer.swf");
copyFlvAsset(flvDirectory, "20051210-w50s.flv");
//render the html
createVideoHtml(flvHtml, "20051210-w50s.flv");
//load the content into the webview
webView.loadUrl(Uri.fromFile(flvHtml).toString());
//sit back, watch FLV and eat popcorn
}
}
private void createVideoHtml(File htmlFile, String htmlFileName)
{
//TODO render your own html file to sdcard
}
private void copySwfAsset(File flvDirectory, String flashFileName)
{
//TODO copy your own SWF video player file from assets
}
private void copyFlvAsset(File flvDirectory, String videoFileName)
{
//TODO copy your oown FLV file from asset folder
}
@Override
protected void onPause(){
super.onPause();
callHiddenWebViewMethod("onPause");
webView.pauseTimers();
if(isFinishing()){
webView.loadUrl("about:blank");
setContentView(new FrameLayout(this));
}
}
@Override
protected void onResume(){
super.onResume();
callHiddenWebViewMethod("onResume");
webView.resumeTimers();
}
private void callHiddenWebViewMethod(String name){
// credits: http://stackoverflow.com/questions/3431351/how-do-i-pause-flash- content-in-an-android-webview-when-my-activity-isnt-visible
if( webView != null ){
try {
Method method = WebView.class.getMethod(name);
method.invoke(webView);
} catch (NoSuchMethodException e) {
//Lo.g("No such method: " + name + e);
} catch (IllegalAccessException e) {
//Lo.g("Illegal Access: " + name + e);
} catch (InvocationTargetException e) {
//Lo.g("Invocation Target Exception: " + name + e);
}
}
}
}
附录
我相信可以通过拦截各种文件的 URL 并使用 WebViewClient.shouldInterceptRequest() 直接从 Assets 文件夹返回数据来绕过安全问题。但这需要 API 11,因此不适合作为通用解决方案。
关于android - 在 webview 中加载 flv 视频的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6596243/
我前段时间下载了一些flv视频,当观看它们时,它们会停在一个点上。如果我跳过那个点,他们会继续播放到另一个点,然后我可以再次跳过(循环一直持续到视频结束) 我已经试过了 avconv -i input
我想知道如何onMetaData FLV 文件中的标记看起来像。当我以纯文本形式打开 FLV 文件时,我得到以下信息: FLV[][][][][](TAB)[][][][][][][]8[][][][
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 9年前关闭。 Improve this que
我对 FLV 流生成有疑问。我开发了 DVR 系统,它应该能够以 FLV 格式流式传输视频(在 Actionscript NetStream 上播放)。我从原始 H264 NAL 单元(0x00 0x
我有两个 FLV 文件,我想创建 1 个 FLV 文件,其中两个 FLV 彼此相邻显示。 例如:2 人用网络摄像头记录了自己。我想创建 1 个 FLV,在其中我看到第一个用户和第二个用户彼此相邻。 这
如何将 FLV 文件加载到影片剪辑(让我们将实例称为“flv PlaceHolder”)并开始播放该 FLV 文件..使用 ActionScript 3? 最佳答案 没有明确回答您的问题,但有许多开源
我想将 flv 与 mp3 合并,而无需在 php 中使用 ffmpeg 触摸/删除 flv 音频流。我尝试了许多命令,但没有任何帮助。这是我现在使用的命令。 /usr/bin/ffmpeg -i "
我有一个 FLV 文件,gstreamer playbin2 可以正常工作,但如果我尝试手动构建管道,结果是否定的。 谁能告诉我我的管道有什么问题?或者,如何在不使用 playbin2 的情况下构建管
我想使用 OpenCV 使用 H264 编解码器从网络摄像头流式传输实时视频,并将其转换为 FLV,然后通过 RTMP 服务器进行流式传输,并使用 flv.js 在浏览器中捕获流。基本上我一切正常,除
我需要以不同的速率显示 FLV 的帧。 这里有些例子: 用户将“擦洗”flv 框架(前/后) flv 需要在用户交互时以一半的速度播放。 目前我正在使用 LoaderMax它是用于加载和播放 FLV
我的平台是PHP JOOMLA MYSQL。我想将上传的不同格式的视频文件编码并加载为.flv。我希望在视频上传网站中实现此功能,用户可以在上传后在前端看到视频,而且我想在 mp4 和 flv 中为它
我在使用 actionscript 3.0(NetStream 类)播放一些快速时间文件时遇到问题。 我无法控制如何生成快速时间文件,但到目前为止,带有未压缩音频的文件似乎根本无法在 Flash Pl
我正在寻找一个 .NET 库或命令行工具,可以让我从 FLV 文件中提取缩略图(AVI 也不错,但不是必需的)。能让我提取电影中大约 15% 的帧就足够了。如果它可以提取几帧,假设每分钟一帧,并用这些
我需要一些关于从 1000 张图像创建 .flv 的建议。 我正在构建的应用程序将使用 flash 来显示 .flv 和具有 red5 rtmp 和 php5 的服务器。服务器将执行从 .jpg 到
使您能够从使用 Flash 播放器的托管站点下载视频的浏览器插件如何工作?他们如何获得 flv 视频的直接链接?是否可以在不实际运行 Flash 插件的情况下这样做? 最佳答案 我不确定具体的浏览器插
我正在尝试生成仅视频的 FLV 文件,我正在使用: libx264 + ffmpeg 30 fps(固定) 使用 VLC 2.0.1 和 flowplayer 进行播放 播放 FLV 时,帧速率似乎约
我正在寻找类似于 FFDshow 的库来帮助我将 .flv 转换为 .avi 格式并可能做更多的事情。我知道我可以通过 VLC 播放器执行此操作,但我宁愿使用 Python 手动执行(并且批量执行)。
我希望我的网站加入一些 FLV 文件中的网络摄像头记录(比如这个)。这需要在 Linux 上完成,无需用户输入。我该怎么做呢?为简单起见,我将使用相同的 flv 作为两个输入,希望获得连续两次播放相同
很难说出这里问的是什么。这个问题是模棱两可的、模糊的、不完整的、过于宽泛的或修辞的,无法以目前的形式得到合理的回答。为了帮助澄清这个问题以便可以重新打开它,visit the help center
hana flv player 是一个在 wordpress 中应用比较广泛的播放器插件, 该插件内置了5种媒体播放器,其播放文件以 flv 文件为主, 并将插入文件的按钮集成到 wordpress
我是一名优秀的程序员,十分优秀!