我有一个与mp4相关的问题。我对视频处理相关的东西不太好。我们对通过实时流的HTTP直播流(HLS)录制的图像文件存在问题。 HLS块只是放在一起并以.mp4文件的形式保存在文件系统中。 Apple QuickTime无法播放此文件。 VLC可以播放它。但是要求它可以用QuickTime播放。
然而,我找到了一个有效的解决方案。当我使用ffmpeg命令-reset_timestamps时,可以使用QuickTime播放视频文件。我还看到哪个参数发生了变化。这是起始值。
在使用命令之前:
ffmpeg -i recorded_file.mp4
ffmpeg version 1.2.4 Copyright (c) 2000-2013 the FFmpeg developers
built on Jan 9 2014 09:06:57 with Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn)
configuration: --prefix=/usr/local/Cellar/ffmpeg/1.2.4 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-nonfree --enable-hardcoded-tables --enable-avresample --enable-vda --cc=clang --host-cflags= --host-ldflags= --enable-libx264 --enable-libfaac --enable-libmp3lame --enable-libxvid
libavutil 52. 18.100 / 52. 18.100
libavcodec 54. 92.100 / 54. 92.100
libavformat 54. 63.104 / 54. 63.104
libavdevice 54. 3.103 / 54. 3.103
libavfilter 3. 42.103 / 3. 42.103
libswscale 2. 2.100 / 2. 2.100
libswresample 0. 17.102 / 0. 17.102
libpostproc 52. 2.100 / 52. 2.100
[h264 @ 0x7fcb7b015a00] non-existing SPS 2 referenced in buffering period
[h264 @ 0x7fcb7b015a00] non-existing PPS referenced
[h264 @ 0x7fcb7b015a00] non-existing SPS 2 referenced in buffering period
[h264 @ 0x7fcb7b015a00] non-existing PPS 0 referenced
[h264 @ 0x7fcb7b015a00] decode_slice_header error
[h264 @ 0x7fcb7b015a00] no frame!
[mpegts @ 0x7fcb7b004a00] max_analyze_duration 5000000 reached at 5013333 microseconds
[mpegts @ 0x7fcb7b004a00] Could not find codec parameters for stream 2 (Unknown: none ([21][0][0][0] / 0x0015)): unknown codec
Consider increasing the value for the 'analyzeduration' and 'probesize' options
[NULL @ 0x7fcb7b016a00] start time is not set in estimate_timings_from_pts
Input #0, mpegts, from 'recorded_file.mp4':
Duration: 00:25:00.01, start: 68428.580933, bitrate: 1499 kb/s
Program 1
Stream #0:0[0x100]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p, 1024x576 [SAR 1:1 DAR 16:9], 25 fps, 25 tbr, 90k tbn, 50 tbc
Stream #0:1[0x101]: Audio: aac ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 124 kb/s
Stream #0:2[0x102]: Unknown: none ([21][0][0][0] / 0x0015)
使用命令:
ffmpeg -i recorded_file.mp4 output.mp4 -reset_timestamps 0
使用命令后的文件:
ffmpeg -i output.mp4
ffmpeg version 1.2.4 Copyright (c) 2000-2013 the FFmpeg developers
built on Jan 9 2014 09:06:57 with Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn)
configuration: --prefix=/usr/local/Cellar/ffmpeg/1.2.4 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-nonfree --enable-hardcoded-tables --enable-avresample --enable-vda --cc=clang --host-cflags= --host-ldflags= --enable-libx264 --enable-libfaac --enable-libmp3lame --enable-libxvid
libavutil 52. 18.100 / 52. 18.100
libavcodec 54. 92.100 / 54. 92.100
libavformat 54. 63.104 / 54. 63.104
libavdevice 54. 3.103 / 54. 3.103
libavfilter 3. 42.103 / 3. 42.103
libswscale 2. 2.100 / 2. 2.100
libswresample 0. 17.102 / 0. 17.102
libpostproc 52. 2.100 / 52. 2.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'output.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf54.63.104
Duration: 00:25:00.04, start: 0.021333, bitrate: 1358 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1024x576 [SAR 1:1 DAR 16:9], 1224 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc
Metadata:
handler_name : VideoHandler
Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 127 kb/s
Metadata:
handler_name : SoundHandler
很多文本输出都会改变,但是持续时间,开始和比特率的行很有意思,因为起始值设置为接近零。
Duration: 00:25:00.04, start: 0.021333, bitrate: 1358 kb/s
所以使用这个解决方案就足够了。问题是,我不能在下载文件的解决方案中使用ffmpeg(它适用于Android)。所以我试着在Java中找到一种方法。但是,由于我在视频处理方面没有太多经验,我无法弄清楚这个ffmpeg命令做了什么,因此不知道在哪个方向寻找Java解决方案。
是否有一个库可以在Java中执行相同的操作,或者有一种简单的方法可以在Java中自己完成(比如调整文件时间戳)?
谢谢你的帮助!
编辑:现在显示整个控制台输出,而不仅仅是它的一部分。
答案 0 :(得分:1)
我的FFMPEG转换MP4在QuickTime中播放的修复方法是在参数中添加-pix_fmt yuv420p
。
在https://trac.ffmpeg.org/wiki/Encode/H.264#FAQ:
找到为哑巴玩家编码
您可能需要使用-pix_fmt yuv420p将输出用于QuickTime和大多数其他播放器。这些播放器仅支持YUV平面色彩空间,具有用于H.264视频的4:2:0色度子采样。否则,根据您的来源,ffmpeg可能会输出可能与这些播放器不兼容的像素格式。
如果有兴趣,请参阅我使用的整个FFMPEG命令:
ffmpeg -i $1 \
-acodec libfaac -b:a 96k \
-vcodec libx264 -b:v 1.5M \
-pix_fmt yuv420p \
-threads 0 -s $2 $destination/$filename.mp4
答案 1 :(得分:0)
我自己找到了解决方案。问题不在于时间戳是错误的,而是输入文件是没有容器的MPEG-TS流。由于容器以.mp4结尾,Qucktime无法播放,因为文件扩展名错误。当我执行ffmpeg命令时,它会自动将流包装到.mp4容器中。所以之后,Quicktime可以播放它,因为文件格式是正确的。将输入文件重命名为.ts(MPEG-TS stream)文件扩展名后,Quicktime也可以播放输入文件。
事实上,我的命令-reset_timestamps解决了这个问题导致我做出错误的假设,即时间戳是问题所在。