gpt4 book ai didi

android - 使用 FFmpeg 在 Android 上将 MPEG4 转换为 MPEGTS

转载 作者:行者123 更新时间:2023-11-29 00:29:37 25 4
gpt4 key购买 nike

好吧,很明显,当我发布原始帖子时,我对 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com