如何使用web服务从VLC(linux)流式传输到iPod(完整过程)?

如何使用web服务从VLC(linux)流式传输到iPod(完整过程)?,linux,ios,web-services,video-streaming,vlc,Linux,Ios,Web Services,Video Streaming,Vlc,我想在linux中用VLC将我的网络摄像头传输到iPod。从我在网上看到的情况来看,最简单的方法是使用web服务器,然后通过iPod访问它,如下所示: NSString *url = @"http://www.example.com/path/to/movie.mp4"; MPMoviePlayerController *moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL URLWithString:u

我想在linux中用VLC将我的网络摄像头传输到iPod。从我在网上看到的情况来看,最简单的方法是使用web服务器,然后通过iPod访问它,如下所示:

NSString *url = @"http://www.example.com/path/to/movie.mp4";
MPMoviePlayerController *moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL URLWithString:url]];
[moviePlayer play];
| segmenter - 10 test test.m3u8 http://www.example.com/path/to/
我以前从未使用过web服务,我想知道如何实现整个过程。多谢各位

编辑:在设置linux/vlc/segmenter之后,这是我在运行Warren的评论并退出vlc后在终端中得到的:

VLC media player 1.1.4 The Luggage (revision exported)
Blocked: call to unsetenv("DBUS_ACTIVATION_ADDRESS")
Blocked: call to unsetenv("DBUS_ACTIVATION_BUS_TYPE")
[0x87bc914] main libvlc: Running vlc with the default interface. Use 'cvlc' to use vlc without interface.
Blocked: call to setlocale(6, "")
Blocked: call to sigaction(17, 0xb71840d4, 0xb7184048)
Warning: call to signal(13, 0x1)
Warning: call to signal(13, 0x1)
Warning: call to srand(1309581991)
Warning: call to rand()
Blocked: call to setlocale(6, "")

(process:4398): Gtk-WARNING **: Locale not supported by C library.
Using the fallback 'C' locale.
Warning: call to signal(13, 0x1)
Warning: call to signal(13, 0x1)
Blocked: call to setlocale(6, "")
Could not open input file, make sure it is an mpegts file: -1

帮我理解这一切?太棒了

显示的URL假定视频已预录制

对于到iOS设备的实时HTTP流,URL将改为以.m3u或.m3u8结尾,这是一种常见的播放列表格式类型。它是Icecast播放列表格式的扩展版本,如中所述。此播放列表告诉iOS设备如何查找它将连续检索的其他文件,以便播放视频

第一个棘手的部分是生成视频流。与所有其他与iOS兼容的媒体文件不同,实时HTTP流需要MPEG-2传输流.ts容器,而不是MPEG-4第14部分容器.mp4、.m4v。正如您所料,视频编解码器仍然是H.264和音频AAC

类似这样的命令应该可以工作:

$ vlc /dev/camera –intf=dummy –sout-transcode-audio-sync –sout='#transcode{\
        vcodec=h264,venc=x264{\
            aud,profile=baseline,level=30,keyint=30,bframes=0,ref=1,nocabac\
        },\
        acodec=mp4a,ab=56,deinterlace\
    }:\
    duplicate{dst=std{access=file,mux=ts,dst=-}}' > test.ts
这是一个很长的命令。为了清晰起见,为了克服SO的格式风格限制,我刚刚对其进行了分解。如果愿意,您可以删除反斜杠和空格,使其成为一条长线。请参阅以获取有关了解这一切的含义以及如何调整的帮助

可能需要调整/dev/camera位,并且您可能需要根据调整的A/V编码参数来适应您的目标iOS设备能力

下一个棘手的问题是从实时视频源生成此播放列表文件和视频片段文件

苹果提供了一个名为的程序,它可以做到这一点,但它不是开源的,它只在OSX上运行,甚至不能免费下载。它是雪豹的一部分,但除此之外,你必须在苹果的开发者程序中下载副本

Chase Douglas已经制作了一个基于libavformat的。有一种新的变体有各种改进

要将其与上面的vlc camera capture and encoding命令结合使用,请将>test.ts部分替换为以下内容:

NSString *url = @"http://www.example.com/path/to/movie.mp4";
MPMoviePlayerController *moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL URLWithString:url]];
[moviePlayer play];
| segmenter - 10 test test.m3u8 http://www.example.com/path/to/
这将VLC的视频输出通过分段器进行传输,分段器将TS分成10秒的块,并维护test.m3u8播放列表文件,该文件告诉iOS设备如何查找分段文件。参数告诉分段器视频流是通过管道传输到其标准输入,而不是来自文件。末尾的URL片段在M3U文件中提到的文件名前面加上前缀


完成所有这些之后,Cocoa Touch代码需要做的唯一调整是,它应该访问test.m3u8,而不是movie.mp4。

您显示的URL假定视频是预录制的

对于到iOS设备的实时HTTP流,URL将改为以.m3u或.m3u8结尾,这是一种常见的播放列表格式类型。它是Icecast播放列表格式的扩展版本,如中所述。此播放列表告诉iOS设备如何查找它将连续检索的其他文件,以便播放视频

第一个棘手的部分是生成视频流。与所有其他与iOS兼容的媒体文件不同,实时HTTP流需要MPEG-2传输流.ts容器,而不是MPEG-4第14部分容器.mp4、.m4v。正如您所料,视频编解码器仍然是H.264和音频AAC

类似这样的命令应该可以工作:

$ vlc /dev/camera –intf=dummy –sout-transcode-audio-sync –sout='#transcode{\
        vcodec=h264,venc=x264{\
            aud,profile=baseline,level=30,keyint=30,bframes=0,ref=1,nocabac\
        },\
        acodec=mp4a,ab=56,deinterlace\
    }:\
    duplicate{dst=std{access=file,mux=ts,dst=-}}' > test.ts
这是一个很长的命令。为了清晰起见,为了克服SO的格式风格限制,我刚刚对其进行了分解。如果愿意,您可以删除反斜杠和空格,使其成为一条长线。请参阅以获取有关了解这一切的含义以及如何调整的帮助

可能需要调整/dev/camera位,并且您可能需要根据调整的A/V编码参数来适应您的目标iOS设备能力

下一个棘手的问题是从实时视频源生成此播放列表文件和视频片段文件

苹果提供了一个名为的程序,它可以做到这一点,但它不是开源的,它只在OSX上运行,甚至不能免费下载。它是雪豹的一部分,但除此之外,你必须在苹果的开发者程序中下载副本

Chase Douglas已经制作了一个基于libavformat的。有一种新的变体有各种改进

要将其与上面的vlc camera capture and encoding命令结合使用,请将>test.ts部分替换为以下内容:

NSString *url = @"http://www.example.com/path/to/movie.mp4";
MPMoviePlayerController *moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL URLWithString:url]];
[moviePlayer play];
| segmenter - 10 test test.m3u8 http://www.example.com/path/to/
这将VLC的视频输出通过分段器进行传输,分段器将TS分成10秒的块,并维护test.m3u8播放列表文件,该文件告诉iOS设备如何查找 段文件。参数告诉分段器视频流是通过管道传输到其标准输入,而不是来自文件。末尾的URL片段在M3U文件中提到的文件名前面加上前缀


完成所有这些之后,Cocoa Touch代码需要做的唯一调整是,它应该访问test.m3u8而不是movie.mp4。

的部分副本,但不同之处在于它覆盖了Cocoa Touch角度,并使用VLC作为视频捕获和编码块,而不是ffmpeg。的部分副本,但不同之处在于,它涵盖了Cocoa触摸角度,并使用VLC作为视频捕获和编码片段,而不是ffmpeg.hum。。我在网上看到过一些类似的东西,但希望有一种更直接的方式来做。。好吧,现在我要尝试所有这些步骤:thks获取所有信息!我尝试了第一个命令,但是给了我很多错误,没有显示我的图像。我在互联网上四处查看,将$vlc/dev/camera更改为$vlc v4l2:///dev/video0。现在它显示视频,终端上没有错误。可以吗?我可以继续吗?是的,你已经知道如何让VLC看到你的特定相机了,所以现在应该是像我展示的那样非常通用的命令了。@warren我很抱歉,但我对linux的东西很在行。。我下载了分节器并将其解压缩到一个文件夹中,但现在我不知道把它放在哪里,因为在运行完完整的命令后,终端说它找不到分节器..你下载的是源代码。你必须建造它。这不是获得这种基本帮助的地方。因此,我们希望您已经知道如何为您的平台构建程序。。我在网上看到过一些类似的东西,但希望有一种更直接的方式来做。。好吧,现在我要尝试所有这些步骤:thks获取所有信息!我尝试了第一个命令,但是给了我很多错误,没有显示我的图像。我在互联网上四处查看,将$vlc/dev/camera更改为$vlc v4l2:///dev/video0。现在它显示视频,终端上没有错误。可以吗?我可以继续吗?是的,你已经知道如何让VLC看到你的特定相机了,所以现在应该是像我展示的那样非常通用的命令了。@warren我很抱歉,但我对linux的东西很在行。。我下载了分节器并将其解压缩到一个文件夹中,但现在我不知道把它放在哪里,因为在运行完完整的命令后,终端说它找不到分节器..你下载的是源代码。你必须建造它。这不是获得这种基本帮助的地方。因此,我们希望您已经知道如何为您的平台构建程序。