在nodejs文档中,streams部分说我可以做fs.createReadStream(url || path)。但是,当我真正这样做时,它告诉我Error: ENOENT: no such file or directory。我只想将视频从可读流传输到可写流,但我坚持创建一个可读流。
我的代码:
const express = require('express')
const fs = require('fs')
const url = 'https://www.example.com/path/to/mp4Video.mp4'
const port = 3000
app.get('/video', (req, res) => {
const readable = fs.createReadStream(url)
})
app.listen(port, () => {
console.log('listening on port ' + port)
})
Run Code Online (Sandbox Code Playgroud)
错误:
listening on port 3000
events.js:291
throw er; // Unhandled 'error' event
^
Error: ENOENT: no such file or directory, open 'https://www.example.com/path/to/mp4Video.mp4'
Emitted 'error' event on ReadStream instance …Run Code Online (Sandbox Code Playgroud) 我是Android编程的新手并且发现自己陷入困境我一直在研究各种方法从手机到手机直播视频直播,似乎主要是功能性的,当然除了最重要的部分:播放流.它似乎是从一部手机发送流,但第二部手机无法播放流.
这是播放方的代码
public class VideoPlayback extends Activity implements Callback {
MediaPlayer mp;
private SurfaceView mPreview;
private SurfaceHolder holder;
private TextView mTextview;
public static final int SERVERPORT = 6775;
public static String SERVERIP="192.168.1.126";
Socket clientSocket;
private Handler handler = new Handler();
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mPreview = (SurfaceView) findViewById(R.id.surfaceView1);
mTextview = (TextView) findViewById(R.id.textView1);
holder = mPreview.getHolder();
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
mTextview.setText("Attempting to connect");
mp = new MediaPlayer();
Thread t = …Run Code Online (Sandbox Code Playgroud) android file-descriptor video-streaming media-player live-streaming
我有兴趣创建一个可以从YouTube中央服务器流式传输视频的iPhone应用程序.我想知道是否有人曾尝试过这样做,最不具有抵抗力的现有API的路径是什么?我真的一无所知.我会使用套接字吗?只是在这里寻找一些方向.谢谢!
iPad/iOS具有视频流支持,例如H.264使用MPMoviePlayerController等,但我通过自定义的专有流接收H.264数据,需要在软实时场景中对其进行解码.
可以通过任何方式访问iPad/iOS的视频解码器来解码这些数据吗?
更新:显然iOS 4.0核心媒体框架支持解码帧并知道H.264,但是没有示例代码也无法看到我实际应该为实际解码调用的内容.
更新(十年后!)
对于谷歌搜索这里的任何人,你现在用iOS"VideoToolbox"在iOS中这样做.
我尝试了很多很多不同的配置,文件,编码,浏览器等等,但这是演示我遇到的问题的最简单的例子.
如果在FF 8.0.1中粘贴JSPlayer的示例视频的URL,则视频将内联播放:
http://video-js.zencoder.com/oceans-clip.webm
如果我拍摄相同的视频并将其上传到我的s3存储桶,则会触发下载:
https://s3.amazonaws.com/turingvideos/oceans-clip.webm - 或 - http
(读取文件和存储桶中每个人的权限)
那么,让我们试试Cloud Front.
d2yat6m71lu23b dot cloudfront dot net slash oceans-clip.webm(下载触发器)
和云前端流媒体:
strzsu4h2ax96 dot cloudfront dot net slash oceans-clip.webm(无限微调器)
使用html视频标签时也会发生相同的基本情况.从zencoder工作正常,除了本地磁盘读取以外的其他任何东西.
那么,zencoder管理的魔力是什么,完全超出了我对S3/CloudFront的影响?我完全难过了.
编辑:
将内容类型和处置设置为"video/webm"和"inline"就可以了.谢谢你的快速反应.
从avi转换为mp4(x264)时,我遇到了fps问题.最终问题出现在PTS和DTS值中,因此第12-15行在av_interleaved_write_frame函数之前添加:
1. AVFormatContext* outContainer = NULL;
2. avformat_alloc_output_context2(&outContainer, NULL, "mp4", "c:\\test.mp4";
3. AVCodec *encoder = avcodec_find_encoder(AV_CODEC_ID_H264);
4. AVStream *outStream = avformat_new_stream(outContainer, encoder);
5. // outStream->codec initiation
6. // ...
7. avformat_write_header(outContainer, NULL);
8. // reading and decoding packet
9. // ...
10. avcodec_encode_video2(outStream->codec, &encodedPacket, decodedFrame, &got_frame)
11.
12. if (encodedPacket.pts != AV_NOPTS_VALUE)
13. encodedPacket.pts = av_rescale_q(encodedPacket.pts, outStream->codec->time_base, outStream->time_base);
14. if (encodedPacket.dts != AV_NOPTS_VALUE)
15. encodedPacket.dts = av_rescale_q(encodedPacket.dts, outStream->codec->time_base, outStream->time_base);
16.
17. av_interleaved_write_frame(outContainer, &encodedPacket)
Run Code Online (Sandbox Code Playgroud)
看完很多帖后我还是不明白:
outStream->codec->time_base= 1/25和outStream->time_base= 1/12800.第一个由我设定,但我无法弄清楚为什么和谁设置12800?我注意到在行(7) …我有HLS播放列表,如下所示:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-PLAYLIST-TYPE:EVENT
#EXT-X-TARGETDURATION:10
#EXT-X-ALLOW-CACHE:NO
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:9.97667,
https://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear1/fileSequence0.ts
#EXTINF:9.97667,
https://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear1/fileSequence1.ts
#EXTINF:9.97667,
https://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear1/fileSequence2.ts
#EXTINF:9.97667,
https://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear1/fileSequence3.ts
Run Code Online (Sandbox Code Playgroud)
它们是EVENT类型的,意思是,当块变得可用时附加块,并且当所有块都存在时,#EXT-X-ENDLIST在末尾附加标记.
因此,当上传所有块时,我们最终得到一个类似于以下内容的播放列表:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-PLAYLIST-TYPE:EVENT
#EXT-X-TARGETDURATION:10
#EXT-X-ALLOW-CACHE:NO
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:9.97667,
https://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear1/fileSequence0.ts
#EXTINF:9.97667,
https://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear1/fileSequence1.ts
#EXTINF:9.97667,
https://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear1/fileSequence2.ts
#EXTINF:9.97667,
https://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear1/fileSequence3.ts
#EXTINF:9.97667,
https://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear1/fileSequence4.ts
#EXTINF:9.97667,
https://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear1/fileSequence5.ts
#EXT-X-ENDLIST
Run Code Online (Sandbox Code Playgroud)
我们在所有客户中都看到了奇怪的行为.如果您在iOS和Safari中打开m3u8播放列表,则在上传第一个块(或者甚至是3个块之后)时,播放器将开始播放视频.偶尔它会停止,但无法恢复.通常情况下,它甚至不会开始播放.
完全形成的播放列表(即带有#EXT-X-ENDLIST标签)完美播放.就在播放列表部分完成时.
我们尝试了各种各样的播放器:Quicktime,Safari,iOS,VLC,Flowplayer等.所有这些都有各种各样的问题,但这是最紧迫的.
任何洞察解决这个问题的方法都将非常感激.
编辑:我们尝试过HLS.js并且播放完美.这样一个不错的用户体验
编辑2:为了重现,我建议使用某种本地HTTP服务器(我使用python -m SimpleHTTPServer上面提供的播放列表.然后逐字地将文件附加到播放列表以模拟文件的上传,并观察播放器中断.
编辑3:好的,我已经构建了一个简单的测试工具来观察行为.https://github.com/dbousamra/m3u8-example运行node app.js然后open http://localhost:3001/playlist.m3u8在Safari或任何你想要的播放器中尝试.它应该可以播放,因为它是一个完整的播放列表.**
但是,如果添加一个查询参数?start=<some unix timestamp>,它将模拟事件的追加,每6秒一个块,从该时间戳开始,直到完成所有块,此时它将追加#EXT-X-ENDLIST一行.
示例网址: http://localhost:3001/playlist.m3u8?start=1460092250872
编辑5:我现在已经在Heroku上了解它:http://guarded-mesa-71212.herokuapp.com/playlist.m3u8?start =
我正在 Flutter 中开发一个应用程序,它在列表中显示视频(如 Instagram)。视频必须流式传输,因此我无法先下载它们然后再播放它们。
我想在流式传输时缓存它们。我看过CacheManager课程,但它会下载整个文件,然后将其传递给视频播放器进行播放。
如何在将视频文件下载到缓存文件夹时实现缓存管理器以显示视频文件?
在ExoPlayer < 2.x有一类PlayerControl与pause()和resume()功能,但它已被删除.我找不到办法做到这一点ExoPlayer 2.
如何暂停和恢复播放?
我有一个带有直播功能的MediaPlayer应用程序.当我使用物理设备(API 22 Lollipop和API 23 Marshmallow)测试应用程序时,启动流没有问题.今天我想用仿真器(API 25 Nougat)测试应用程序.流不工作,我收到以下错误:
(SourceFile:139)java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:607)at java.lang.Thread.run( Thread.java:761)在com.google.android.apps.gsa.shared.util.concurrent.a.ad $ 1.run(SourceFile:85)02-23 23:58:09.834 2166-3554/com.google. android.googlequicksearchbox:搜索W/ErrorProcessor:onFatalError,处理引擎错误(4)com.google.android.apps.gsa.shared.speech.ag:从com.google.android.apps.gsa的输入流中读取错误. staticplugins.recognizer.iaa(SourceFile:342)at com.google.android.apps.gsa.staticplugins.recognizer.ia $ 1.run(SourceFile:1367)at java.util.concurrent.Executors $ RunnableAdapter.call(Executors.java) :428)在Java的com.google.android.apps.gsa.shared.util.concurrent.a.ak.run(SourceFile:66)的java.util.concurrent.FutureTask.run(FutureTask.java:237). java.util.concurrent上的util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133).ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:607)at java.lang.Thread.run(Thread.java:761)at com.google.android.apps.gsa.shared.util.concurrent.a.ad $ 1.run (SourceFile:85)引起:com.google.android.apps.gsa.shared.exception.GsaIOException:错误代码:393238 | 缓冲区溢出,没有可用空间.com.google.android.apps.gsa.speech.audio.Tee.g(SourceFile:2531)at com.google.android.apps.gsa.speech.audio.ap.read(SourceFile:555)at java.io com.google.android.apps.gss.csa. java.util.concurrent.Executors $ 1.run(SourceFile:471)在com.google.android的java.util.concurrent.FutureTask.run(FutureTask.java:237)上的$ RunnableAdapter.call(Executors.java:428) .coms.gss..shared.util.concurrent.a.ak.run(SourceFile:66)at com.google.android.apps.gsa.shared.util.concurrent.a.ax.run(SourceFile:139)at com .google.android.apps.gsa.shared.util.concurrent.a.ax.run(SourceFile:139),位于java.util.concurrent.ThreadPoolExecutor的java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) $ Worker.run(ThreadPoolExecutor.java:607)位于com.google.android.apps.gsa.shared.util.concurrent.a.ad $ 1.run的java.lang.Thread.run(Thread.java:761)的SourceFile:85)
我只能认出一件我认为重要的事情.
GsaIOException:错误代码:393238 | 缓冲区溢出,没有可用空间
但我不知道这意味着什么.任何人都可以解释它是什么样的异常.我可以在哪里搜索代码来查找问题?