- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
好吧,很明显,当我发布原始帖子时,我对 ffmpeg API 知之甚少……当一个人开始学习数字媒体和转换细节时,它会让人不知所措。在阅读了更多内容并浏览了 ffmpeg 源代码之后,我能够获得从 mp4 到 mpegts 的工作输出。这个概念类似于执行:
ffmpeg -i in.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb out.ts
但正如我之前提到的,我需要在 C 中使用 ffmpeg API 来实现它。
因此,尽管我能够生成可播放的 .ts 文件,但其视频和音频流并未同步。也就是说,当音频以正常速度播放时,在 Android 平板电脑上播放它们会非常缓慢地播放视频,然后(一旦音频流结束)视频以正常速度播放到最后。在 VLC 中播放相同生成的 .ts 文件会产生非常浓缩的音频(就像快进一样)并且可以很好地播放视频。
媒体转换还有很多方面我不熟悉。我确信其中一些会阻止我成功转换。
以下是有关文件的一些信息(通过 ffprobe):- in.mp4 - 通过 Android 录制生成的文件 - MPEG4 (H.264 + AAC)- ffmpeg.ts - 通过 ffmpeg 转换生成的文件 - MPEG2TS (H.264 + AAC)- out.ts - 通过我的代码生成的文件 - MPEGTS (H.264 + AAC)
in.mp4
filename=in.mp4
nb_streams=2
format_name=mov,mp4,m4a,3gp,3g2,mj2
format_long_name=QuickTime/MPEG-4/Motion JPEG 2000 format
start_time=0:00:00.000000
duration=0:00:09.961383
size=4.730 Mibyte
bit_rate=3.983 Mbit/s
TAG:major_brand=isom
TAG:minor_version=0
TAG:compatible_brands=isom3gp4
TAG:creation_time=2013-05-28 17:06:57
ffmpeg.ts
filename=ffmpeg.ts
nb_streams=2
format_name=mpegts
format_long_name=MPEG-2 transport stream format
start_time=0:00:01.400000
duration=0:00:09.741267
size=5.132 Mibyte
bit_rate=4.419 Mbit/s
out.ts
filename=out.ts
nb_streams=2
format_name=mpegts
format_long_name=MPEG-2 transport stream format
start_time=0:00:00.000000
duration=0:00:09.741267
size=5.166 Mibyte
bit_rate=4.449 Mbit/s
首先,我无法影响输出文件的开始时间。接下来,在检查探测器的 -show_packets 输出时,我看到了以下内容:
ffmpeg.ts
[PACKET]
codec_type=video
stream_index=0
pts=N/A
pts_time=N/A
dts=N/A
dts_time=N/A
duration=0
duration_time=0:00:00.000000
size=20.506 Kibyte
pos=564
flags=K
[/PACKET]
[PACKET]
codec_type=video
stream_index=0
pts=N/A
pts_time=N/A
dts=N/A
dts_time=N/A
duration=0
duration_time=0:00:00.000000
size=11.727 Kibyte
pos=22936
flags=_
[/PACKET]
...
[PACKET]
codec_type=audio
stream_index=1
pts=126000
pts_time=0:00:01.400000
dts=126000
dts_time=0:00:01.400000
duration=2089
duration_time=0:00:00.023211
size=285.000 byte
pos=109416
flags=K
[/PACKET]
[PACKET]
codec_type=audio
stream_index=1
pts=128089
pts_time=0:00:01.423211
dts=128089
dts_time=0:00:01.423211
duration=2089
duration_time=0:00:00.023211
size=374.000 byte
pos=-1
flags=K
[/PACKET]
...
[PACKET]
codec_type=video
stream_index=0
pts=N/A
pts_time=N/A
dts=N/A
dts_time=N/A
duration=0
duration_time=0:00:00.000000
size=20.000 Kibyte
pos=87232
flags=_
[/PACKET]
[PACKET]
codec_type=video
stream_index=0
pts=N/A
pts_time=N/A
dts=N/A
dts_time=N/A
duration=0
duration_time=0:00:00.000000
size=16.852 Kibyte
pos=112800
flags=_
[/PACKET]
out.ts
[PACKET]
codec_type=audio
stream_index=1
pts=0
pts_time=0:00:00.000000
dts=0
dts_time=0:00:00.000000
duration=2089
duration_time=0:00:00.023211
size=285.000 byte
pos=22936
flags=K
[/PACKET]
[PACKET]
codec_type=audio
stream_index=1
pts=1024
pts_time=0:00:00.011378
dts=1024
dts_time=0:00:00.011378
duration=2089
duration_time=0:00:00.023211
size=374.000 byte
pos=23312
flags=K
[/PACKET]
...
[PACKET]
codec_type=video
stream_index=0
pts=N/A
pts_time=N/A
dts=N/A
dts_time=N/A
duration=0
duration_time=0:00:00.000000
size=11.727 Kibyte
pos=25004
flags=_
[/PACKET]
[PACKET]
codec_type=audio
stream_index=1
pts=7168
pts_time=0:00:00.079644
dts=7168
dts_time=0:00:00.079644
duration=2089
duration_time=0:00:00.023211
size=299.000 byte
pos=55460
flags=K
[/PACKET]
如您所见,ffmpeg.ts 从没有 pts/dts 的视频包开始。随后的音频数据包包含 pts/dts。如此重复直到结束。根据ffprobe输出,所有视频包都没有pts/dts。
然而,out.ts 以音频数据包开始,并与视频数据包交替。这里,视频包也没有pts/dts。不同之处在于,这里在一系列音频数据包之间有一个视频数据包。其余视频数据包发生了什么(ffmpeg.ts 有 ~5 个音频,后跟 ~5 个视频)。
显然,我仍在学习,还不知道太多……有没有什么问题对任何人来说都是显而易见的?我将非常感谢任何信息/建议,但我会继续努力!!
最佳答案
好吧,正如我所怀疑的,这很明显,但对新手来说却不是。基本上,即使您不必重新编码数据包,原始容器中的流每个流都有自己的时间基准。这需要转换或“重新缩放”到新输出流的时基。
packet.pts = av_rescale_q(packet->pts, inStream->time_base, outStream->time_base);
packet.dts = av_rescale_q(packet->dts, inStream->time_base, outStream->time_base);
这将为每个流正确地重新缩放数据包。当然,这可能是可以采取的最基本的操作,可能需要执行额外的交替/重新缩放(如果数据包没有 dts/pts)。但是,我可以控制输入文件,所以这对我来说应该足够了。
关于android - 使用 FFmpeg 在 Android 上将 MPEG4 转换为 MPEGTS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16679801/
我正在创建一个播放静态 mpeg-DASH 文件的应用程序。我一直在使用 MP4Box 创建 DASH .mp4 和 .mpd 文件。 MPD 文件包含单个 .mp4 文件中的字节范围偏移列表。这工作
我检查了一些 MPEG-4 视频 header ,并在开头看到了一些字节数组,如下所示: 00 00 01 B0 01 00 00 01 B5 89 13 我知道 00 00 01 部分,但 B0 B
我正在尝试实现用于播放受 widevine 保护的视频的 Android 应用程序。我在 Exoplayer 上构建我的应用程序,但我遇到了 MediaDrm 问题。 android.media.Me
我正在寻找区分使用 MPEG-1 和 MPEG-2 容器的文件的具体方法,因为我发现的大多数资源都表明这两个容器的起始代码都是 00 00 01 BA。 我尝试使用 VLC 的 GUI 将 MP4 容
我已经编写了 MPEG-TS 解复用器。它将传输流解包为 PES 数据包。现在我想丢弃所有帧,直到遇到关键帧。 我该怎么做?我应该在每个 PES 帧中找到序列 block 吗? 最佳答案 您应该能够在
我正在尝试能够从 MPEG、MPEG-TS 和 MPEG-PS 文件以及实时流(网络/UDP/RTP 流)中挑选出帧(视频和元数据)。我正在研究使用 JCODEC 来执行此操作,我开始尝试使用 Fra
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许在 Stack Overflow 上提出有关通用计算硬件和软件的问题。您可以编辑问题,使其成为
在带有 ARM 和/DSP 的 Android 平台上,哪个解码器会更快:MPEG-4 或 MPEG-2 还是 3GP?为什么? 谢谢 最佳答案 “更快”是一个相对术语。鉴于您问题中的信息,无法回答。
通过 UDP 流式传输,我有一个 MPEG Transport Stream包含: MPEG-2 视频和 MPEG-1 音频,或 H.264 视频和 MPEG-1 音频,或 H.264 视频和 AC3
我对编解码器了解较少。我所知道的编解码器代表解码/编码。在编解码器中将内置在手机中,外部库可以用作替代方案。编解码器对音频\视频起着重要作用,其中格式已编码为文件并解码以播放它们。 问题: Andro
我不知道我需要在哪个标签上问这个问题。 我目前正在研究数字电视广播的 ATSC 标准。我在浏览内容时有疑问。在数字电视广播中,一个带宽将包含多个 channel (服务)。 由广播公司编码和复用的数据
MPEG中节目时钟引用(PCR)的最大值是多少? 据我了解,它源自 27MHz 时钟,定期加载到 42 位寄存器中。 PCR(i)=PCR_Base(i) * 300 + PCR_Ext(i) 其中
我有一些与将 mpeg PES 流(打包)多路复用到 mpeg TS 相关的问题。 为什么 DTS 和 PTS 值包含在 PES 头中,而 PCR 值包含在传输流头中? 如果我们想以某种方式播放 PE
关闭。这个问题需要更多 focused .它目前不接受答案。 想改进这个问题?更新问题,使其仅关注一个问题 editing this post . 1年前关闭。 Improve this questi
。我试图了解 mpd 文件如何播放,我指的是以下数据集: http://www-itec.uni-klu.ac.at/ftp/datasets/mmsys12/Valkaama/MPDs/Valkaa
我正在尝试将几个 .wav 文件转换为 .mp3 格式 所需的 .mp3 格式是: 我尝试使用 FFmpeg 使用以下代码: ffmpeg -i input.wav -vn -ac 2 -b:a 16
我有一个支持 CENC 的 MPD 剪辑,如何在不使用任何特定 DRM 引擎的情况下解密和播放?是否有任何解密算法可用于解密 AES CTR 128 位?如果有,它将用于解密 MPEG-DASH 内容
以下是MPEG2VideoDescriptor的十六进制转储: 06 0e 2b 34 02 53 01 01 0d 01 01 01 01 01 51 00 83 00 00 f3 3c 0a 00
我需要检测文件是否为 MPEG ADTS 文件。我已经四处搜索了它,但无论是我寻找得很糟糕还是其他东西,但我找不到我可以肯定地说某些文件具有 MPEG ADTS 格式的签名。 例如如果文件以这样的签名
我正在开发用于网络吞吐量测试的点对点视频流。两个对等点之间的网络支持低比特率传输。 我使用 OpenCV 为视频流制作了简单的 python 程序。 该程序从网络摄像头抓取视频帧并将其编码为 JPEG
我是一名优秀的程序员,十分优秀!