FFMPEG 在使用 h264 编码器进行转码时从原始视频中删除了可能损坏的帧
FFMPEG drops supposedly corrupt frames from original video while transcoding using h264 encoder
我正在使用 h264 优化 MP4 网页版。我有一个视频在最初的 1-2 秒内有一些据称损坏的帧。 (下方提供的框架)
关于转码使用:
ffmpeg -i orig.mp4 -c:v libx264 -crf 25 -vf scale="-2:min(ih\,720)" -b:v 600K -g 90 -c:a libfdk_aac output.mp4
输出 MP4 丢失了这些帧,我的输出开始时比原始视频延迟了大约 1 到 2 秒,因此导致输出视频的总体持续时间减少。
此外,大多数媒体播放器在播放时也会跳过这些帧(如 quicktime 播放器等)。但是 VLC 媒体播放器能够在不跳过这些帧的情况下播放该视频。
有没有办法使用 ffmpeg 不掉帧?如果可能的话,是否可以识别并修复视频中的这些帧?
注意:我尝试使用 AWS Elastic 转码器对同一视频进行编码,它实际上修复了这些帧(下面提供的帧):
Note: Original video can be found here -
https://drive.google.com/file/d/0B9VkhR9Zu60ybXFDeno3RGpQTUE/view?usp=sharing
Video transcoded by AWS Elsatic transcoder can be found here -
https://drive.google.com/file/d/0B9VkhR9Zu60yWUVHQk5MTk05QVk/view?usp=sharing
EDIT1: As suggested by @Mulvya in comments, TS-transcoded video can be found here - (https://drive.google.com/file/d/0B9VkhR9Zu60yU0t6T0dMME9ZMmc/view?usp=sharing)
您的源视频中有些帧没有时间戳。
在这种特殊情况下,提取到原始比特流然后转码有效:
ffmpeg -i orig.mp4 -c copy orig.264
ffmpeg -i orig.264 -i orig.mp4 -map 0 -map 1:a -c:v libx264 -crf 25 -vf scale="-2:min(ih\,720)" -b:v 600K -g 90 -c:a libfdk_aac output.mp4
已将视频转换为原始视频文件
ffmpeg -i VID_1550287359485.mp4 -vcodec copy -an -bsf:v h264_mp4toannexb raw2.h264
ffmpeg -framerate 24 -i raw2.h264 -c copy output-a.mp4
从 mp3 格式的视频中提取音频
ffmpeg -i VID_1550287359485.mp4 -b:a 192K -vn music2.mp3
解决音频和视频长度问题
ffprobe -i music2.mp3 -show_entries format=duration -v quiet -print_format json
ffprobe -i output-a.mp4 -show_entries format=duration -v quiet -print_format json
ffmpeg -i music2.mp3 -filter:a atempo="0.827415438" new-latest2.mp3
逆时针旋转视频90度
ffmpeg -i output-a.mp4 -vf "transpose=2" output-new.mp4
合并视频和音频以制作输出文件
ffmpeg -i output-new.mp4 -i new-latest2.mp3 -c:v libx264 -c:a aac -strict experimental -shortest output-second.mp4
我正在使用 h264 优化 MP4 网页版。我有一个视频在最初的 1-2 秒内有一些据称损坏的帧。 (下方提供的框架)
关于转码使用:
ffmpeg -i orig.mp4 -c:v libx264 -crf 25 -vf scale="-2:min(ih\,720)" -b:v 600K -g 90 -c:a libfdk_aac output.mp4
输出 MP4 丢失了这些帧,我的输出开始时比原始视频延迟了大约 1 到 2 秒,因此导致输出视频的总体持续时间减少。
此外,大多数媒体播放器在播放时也会跳过这些帧(如 quicktime 播放器等)。但是 VLC 媒体播放器能够在不跳过这些帧的情况下播放该视频。
有没有办法使用 ffmpeg 不掉帧?如果可能的话,是否可以识别并修复视频中的这些帧?
注意:我尝试使用 AWS Elastic 转码器对同一视频进行编码,它实际上修复了这些帧(下面提供的帧):
Note: Original video can be found here - https://drive.google.com/file/d/0B9VkhR9Zu60ybXFDeno3RGpQTUE/view?usp=sharing Video transcoded by AWS Elsatic transcoder can be found here - https://drive.google.com/file/d/0B9VkhR9Zu60yWUVHQk5MTk05QVk/view?usp=sharing
EDIT1: As suggested by @Mulvya in comments, TS-transcoded video can be found here - (https://drive.google.com/file/d/0B9VkhR9Zu60yU0t6T0dMME9ZMmc/view?usp=sharing)
您的源视频中有些帧没有时间戳。
在这种特殊情况下,提取到原始比特流然后转码有效:
ffmpeg -i orig.mp4 -c copy orig.264
ffmpeg -i orig.264 -i orig.mp4 -map 0 -map 1:a -c:v libx264 -crf 25 -vf scale="-2:min(ih\,720)" -b:v 600K -g 90 -c:a libfdk_aac output.mp4
已将视频转换为原始视频文件
ffmpeg -i VID_1550287359485.mp4 -vcodec copy -an -bsf:v h264_mp4toannexb raw2.h264
ffmpeg -framerate 24 -i raw2.h264 -c copy output-a.mp4
从 mp3 格式的视频中提取音频
ffmpeg -i VID_1550287359485.mp4 -b:a 192K -vn music2.mp3
解决音频和视频长度问题
ffprobe -i music2.mp3 -show_entries format=duration -v quiet -print_format json
ffprobe -i output-a.mp4 -show_entries format=duration -v quiet -print_format json
ffmpeg -i music2.mp3 -filter:a atempo="0.827415438" new-latest2.mp3
逆时针旋转视频90度
ffmpeg -i output-a.mp4 -vf "transpose=2" output-new.mp4
合并视频和音频以制作输出文件
ffmpeg -i output-new.mp4 -i new-latest2.mp3 -c:v libx264 -c:a aac -strict experimental -shortest output-second.mp4