我花了很多时间试图让DTVViewer的DirectShow样本工作不幸,但没有成功.DVBT网络的视频格式是H264,我发现IntelliConnect行为IFilterGraph
更喜欢使用Mpeg2视频格式.
对于那些想要查看代码的人来说,就是这样.如果你对DirectShow一无所知我分享了我对这段代码的经验.最可能的问题在本教程的第5步和第6步中描述.
连接过滤器的辅助函数代码:
public static void UnsafeConnectFilters(IFilterGraph2 graph, IBaseFilter source, IBaseFilter dest, Func<AMMediaType, bool> sourceMediaPredicate=null, Func<AMMediaType, bool> destMediaPredicate=null) {
foreach(IPin spin in IteratePinsByDirection(source, PinDirection.Output)) {
if(IsConnected(spin))
continue;
int fetched;
AMMediaType[] sourceTypes=GetMajorType(spin, out fetched);
if(fetched>0) {
Guid sourceType=sourceTypes[0].majorType;
try {
if(sourceMediaPredicate!=null&&!sourceMediaPredicate(sourceTypes[0]))
continue;
foreach(IPin pin in IteratePinsByDirection(dest, PinDirection.Input)) {
if(IsConnected(pin))
continue;
var types=GetMajorType(pin, out fetched);
try {
if(fetched>0) {
Guid destType=types[0].majorType;
if(destMediaPredicate!=null&&!destMediaPredicate(types[0]))
continue;
if(sourceType==destType) {
spin.Connect(pin, types[0]);
return;
}
}
else {
spin.Connect(pin, sourceTypes[0]);
return;
}
}
finally …
Run Code Online (Sandbox Code Playgroud)我有一个文件,我需要转换为MPEG-TS,以便它符合以下规范:
基本流比特率[kbit/s]视频:2575音频:2 x 192字幕: - PAT/PMT: - 填充: -
分量TS比特率[kbit/s]视频:2652音频:395字幕:45 PAT/PMT:45填充:62总计:3200 CBR
其他必需组件:PAT PMT空包
可能弹出的组件:NIT,SDT,EIT等.
vcodec="h264"
acodec="mpga"
bitrate="2500"
arate="192"
samplerate=48000
ext="mpg"
mux="ts"
vlc="/usr/bin/vlc"
fmt="mpg"
dst="/home/adam/test/"
for a in *$fmt; do
$vlc -I dummy -vvv "/home/adam/test/" --sout "#transcode{vcodec=$vcodec,venc=x264{profile=main,level=3.0,hrd=cbr,bframes=2},vb=$bitrate,acodec=$acodec,ab=$arate,samplerate=$samplerate,channels=2}:standard{mux=$mux,dst=\"$dst$a.$ext\",ac$
done
Run Code Online (Sandbox Code Playgroud)
使用上面的脚本编码后,一切似乎都可以(视频和音频比特率编解码器都是常量)除了两件事:容器的比特率也应该保留CBR但事实并非如此.此外,填充组件(0x1 ffff) - 缺少空数据包.您是否可以更正脚本以使空数据包以及容器的比特率恒定(3,2 Mbps CBR)?
第二个选项是使用ffmpeg进行编码:
ffmpeg -i video_input.mpg -i audio_input.mp2 -acodec copy -tune zerolatency -x264opts bitrate=2600:vbv-maxrate=2600:vbv-bufsize=166:nal_hrd=cbr -vpre libx264-iptv -vcodec libx264 -f mpegts -muxrate 3200K -y output.ts
Run Code Online (Sandbox Code Playgroud)
但如何取消/禁用/删除SDT表?
是否有任何开源替代品ffmpeg
,并VLC
以实时视频转码,从HTTP数据流将RTMP或其他?
ffmpeg
导致我的 CPU(AMD 4.0GHZ 8Core)100% 加载,只有 8 个 SD 流。
感谢帮助。
附注。我想我不需要转码我的视频,我也可以使用 http 视频代理之类的东西进行流式传输。源是 HTTP 流格式,我也在 Linux 下。
我正在尝试设置一个.bundle文件夹来加载我为AutoCAD设计的一系列插件.其中一个插件是.dvb文件,所以在PackageContents.xml中我有以下XML代码
<ComponentEntry AppName = "" Version = "2014.1" ModuleName = "./Contents/Windows/WindowsDoors.dvb" AppDescription = "" PerDocument ="True" LoadOnAutoCADStartup="True">
<Commands>
<Command Local="CSC" Global="CAD_STANDARD_CREATOR" />
<Command Local="CSB" Global="CAD_STANDARD_BLOCK" />
<Command Local="CSP" Global="CAD_STANDARD_PATH" />
</Commands>
</ComponentEntry>
Run Code Online (Sandbox Code Playgroud)
当我启动AutoCAD并尝试运行相应的插件时,命令行告诉我
Command: -vbarun
Macro name: RunMeWindowDoor
Macro not found.
Run Code Online (Sandbox Code Playgroud)
看来AutoCAD没有找到宏,即使我告诉XML文件加载它,我也无法弄清楚错误的原因是什么.
根据我的理解,DVB-T数据包通过两个FEC系统,即Viterbi,数据丢失高达50%,RS,数据丢失高达10%.这些被称为外部和内部编码.
我无法理解第二次RS编码的需要(在这种情况下,188字节长的MPEG-TS数据包又增加了20个字节).
更具体地说,损坏的数据包会发生什么,例如55%?维特比解码器是否修复了50%的错误,而RS的剩余5%错误是固定的?
对不起我的傻瓜.
我解码UDP使用流(从DVB信号genrate)FFMPEG到HLS与此代码:
ffmpeg -i udp://239.1.2.1:60001?fifo_size=50000000 -acodec copy -vcodec copy -hls_time 2 -hls_wrap 5 -f hls /var/www/html/ts/1.m3u8
Run Code Online (Sandbox Code Playgroud)
有时DVB信号下降一秒钟或一分钟,导致ffmpeg停止编码并显示错误:
udp://239.1.2.1:60001: Connection timed out
Run Code Online (Sandbox Code Playgroud)
当我在VLC播放器中播放udp且输入流下降了一些第二个VLC时,请停止播放,当流重新开始时再次播放。
现在我想知道是否存在一种ffmpeg要么发现流停止并且不显示超时错误的方法...这意味着FFMPEG保持连接打开并每次从源启动每次等待接收流。谢谢
我不知道我需要问哪个标签这个问题.我目前正在研究数字电视广播的ATSC标准.在浏览内容时我有疑虑.在数字电视广播中,单个带宽将包含多个频道(服务).
由广播公司编码和多路复用的数据称为传输流.
传输流由标头和有效负载组成.标题包括音频基本流或视频基本流或数据基本流的PID.该传输流由包含中间件的机顶盒接收,该中间件解析传输流并将数据放入PAT,PMT,EIT,ETT,SDT,NIT,CAT表中.
是否可以使用PSI表而不是ATSC表?