我已经使用ickbeard_mp4_converter有一段时间了,通过为ffmpeg生成脚本将视频文件转换为mp4。我不确定我更改了什么,但是它生成的 ffmpeg 脚本不再起作用,并且我在调试它时遇到了麻烦。谁能从我的日志中看出问题是什么?是的,它应该是 mp4 到 mp4,这通常没问题。
我现在正在使用一个 mp4,它昨天与相同的自动生成脚本一起工作,但现在不再这样了。我记得更新了 ffmpeg 但降级并没有解决问题,尽管我可能降级得不够。
FFmpeg 4.1.4
媒体信息输出:
$ mediainfo --fullscan Downloads/Dallas\ Buyers\ Club\ \(2013\).mp4.original
General
Count : 334
Count of stream of this kind : 1
Kind of stream : General
Kind of stream : General
Stream identifier : 0
Count of video streams : 1
Count of audio streams : 1
Video_Format_List : AVC
Video_Format_WithHint_List : AVC
Codecs Video : AVC
Audio_Format_List : AAC LC
Audio_Format_WithHint_List : AAC LC
Audio codecs …Run Code Online (Sandbox Code Playgroud) 我尝试使用 libavformat 创建.mp4具有单个 h.264 视频流的视频,但生成的文件中的最后一帧的持续时间通常为零,并且实际上从视频中删除。奇怪的是,最终帧是否被丢弃取决于我尝试添加到文件中的帧数。我在下面概述的一些简单测试让我认为我在某种程度上错误配置了AVFormatContexth.264 编码器,导致两个编辑列表有时会截断最终帧。我还将发布我正在使用的代码的简化版本,以防我犯一些明显的错误。任何帮助将不胜感激:过去几天我一直在努力解决这个问题,但进展甚微。
ffmpeg
如果我使用该选项,我可以通过使用带有复制编解码器的二进制文件创建一个新的 mp4 容器来恢复丢失的帧-ignore_editlist。ffprobe使用、mp4trackdump、 或来检查丢失帧的文件mp4file --dump表明,如果最终帧的采样时间与编辑列表末尾完全相同,则最终帧将被丢弃。当我制作一个没有丢帧的文件时,它仍然有两个编辑列表:唯一的区别是编辑列表的结束时间超出了没有丢帧的文件中的所有样本。虽然这不是一个公平的比较,但如果我.png为每个帧创建一个,然后使用编解码器和类似的 h.264 设置生成一个.mp4,ffmpeg我image2会制作一部包含所有帧的电影,只有一个编辑列表,以及与我的类似的 PTS 时间带有两个编辑列表的损坏的电影。在这种情况下,编辑列表始终在最后一帧/采样时间之后结束。
我使用此命令来确定结果流中的帧数,尽管我也通过其他实用程序获得相同的数字:
ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=nb_read_frames -of default=nokey=1:noprint_wrappers=1 video_file_name.mp4
Run Code Online (Sandbox Code Playgroud)
使用 ffprobe 对文件进行简单检查,除了帧速率受到丢失帧的影响(目标为 24)之外,没有显示出明显令人担忧的迹象:
$ ffprobe -hide_banner testing.mp4
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'testing.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.45.100
Duration: 00:00:04.13, start: 0.041016, bitrate: 724 kb/s …Run Code Online (Sandbox Code Playgroud) 所以我想做的是将使用 pytube 下载 YouTube 视频获得的 mp4 文件转换为使用 moviepy 的 mp3 文件。但是,这些 mp4 文件不包含KeyError: 'video_fps'在 ffmpeg_reader 中引发的任何帧。
是否可以使用 moviepy 来做到这一点,还是我需要使用不同的工具?我想我也可以只下载带有视频的 mp4 文件,但这会浪费资源,尤其是对于大型播放列表。
这是我使用的代码:
from moviepy.video.io.VideoFileClip import VideoFileClip
import pytube
def downloadPlaylist(url):
playlist = pytube.Playlist(url)
for video in playlist.videos:
filename = video.streams.get_audio_only().download()
clip = VideoFileClip(filename)
clip.audio.write_audiofile(filename[:-4] + ".mp3")
clip.close()
Run Code Online (Sandbox Code Playgroud) 我正在使用 Python处理一些.mp4 文件。我正在使用wave、math、contextlib和speech_recognition库AudioFileClip。我有很长的文件(视频+音频)。我想让Python将文件剪切成5分钟的新文件(仍然是.mp4),然后让Python转录它们中的每一个。到目前为止,我能够编写以下代码来转录初始(长)文件:
import wave, math, contextlib
import speech_recognition as sr
from moviepy.editor import AudioFileClip
import os
os.chdir(" ... my path ...") # e.g. C:/Users/User/Desktop
FILE = "file_name" # e.g. video1 (without extension)
transcribed_audio_file_name = FILE + "_transcribed_speech.wav"
mp4_video_file_name = FILE + ".mp4"
audioclip = AudioFileClip(mp4_video_file_name)
audioclip.write_audiofile(transcribed_audio_file_name)
with contextlib.closing(wave.open(transcribed_audio_file_name,'r')) as f:
frames = f.getnframes()
rate = f.getframerate()
duration = frames / float(rate)
total_duration = math.ceil(duration / …Run Code Online (Sandbox Code Playgroud) 我正在尝试将 MP4 视频转换为 WEBP。
我正在尝试不同的-lossless设置-compression_level(如此处所述),但所有输出视频都具有相同的磁盘大小。
-lossless可以是0or1并且-compression_level可以是从0到6
例如
ffmpeg -y -i input.mp4 -vcodec libwebp -lossless 1 -compression_level 6 \
-loop 0 -preset default output_lossless1_comp6.webp
Run Code Online (Sandbox Code Playgroud)
和
ffmpeg -y -i input.mp4 -vcodec libwebp -lossless 0 -compression_level 0 \
-loop 0 -preset default output_lossless0_comp0.webp
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么?
我正在尝试将电影上传到网站上,然后自动将其转换为.mov iPhone格式的.mp4格式.是否有一个PHP转换库或工具,可以帮助我这样做?
谢谢.
我正在尝试在我的Android应用程序中录制音频,但我希望音频文件采用.mp4格式和AAC LC编码; 在我的桌面上播放.所以,使用下面的代码,我试着记录,我能够在我的机器人上播放它.
mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mRecorder.setOutputFile("/mnt/sdcard/abcapp/test.mp4");
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
Run Code Online (Sandbox Code Playgroud)
但是,当我试图在我的电脑上播放它时,我无法播放mp4文件.我尝试使用所有媒体播放器,包括VLC,KMPlayer等,但无法播放.
最令人恼火的一点是,Play商店中的应用程序就像"Easy Voice Recorder"一样,可以在.mp4中录制,并且可以使用Windows Media Player播放.
请帮忙.
谢谢
我使用GAE来提供大文件,我可以使用简单的方式成功提供mp3 blobstoreService.serve(key, res);如果我将资源网址放在浏览器中,媒体控件将出现和/或媒体播放器将启动,音乐将在下载之前启动完成了.
但是,当我在Chrome中添加mp4网址时,控件会出现,但没有任何反应.这是我做的:
Accept-Ranges:bytes为第一个请求,我观察到下一个请求仍然要求完整的75MB范围.即使浏览器要求所有内容,我应该只部分服务吗?除了我的GAE url是src之外,html代码如下所示.示例mp4有效,但如果我的gae链接在那里,它根本不显示视频.
<video width ="640"controls =""> <source src ="http://www.w3schools.com/html/mov_bbb.mp4"type ="video/mp4">您的浏览器不支持HTML5视频.</视频>
GAE服务器端需要做什么才能使用流媒体提供视频服务?
标记的答案提供了有关如何提供mp4文件的充分信息,它还提供了一个用于演示的实时网页.通过该演示,只要Chrome浏览器可以解码,我就可以告诉我的网站可以提供mp4文件.我遇到的问题是由于Chrome无法识别ffmpeg中使用的编解码器.改为H.264,一切正常.
以下是ffmpeg命令行的一个示例,其中OK.MTS是摄像机文件,output1.mp4将被上传:
ffmpeg -i ok.MTS -codec:v libx264 -profile:v baseline -preset slow -b:v 500k -maxrate 800k -bufsize 1000k -vf scale=-1:432 -threads 0 -b:a 96k output1.mp4
Run Code Online (Sandbox Code Playgroud) 我正在编写一个transmuxer,将MPEG-TS文件从HLS流转换为MP4文件,然后可以在Web浏览器中播放.
我原本希望能够将TS文件简单地一对一映射到MP4文件,但事实证明,一些HLS流被分割,使得各个TS文件并不总是从IDR帧开始; 每当您穿过线段边界时,这会导致冻结图像和断断续续.
我想通过连接多个TS文件中的数据,忽略原始文件边界,自己识别视频流中的IDR帧,以及在IDR帧上启动每个新的MP4段,我可以解决这个问题.但是,如果我这样做,我担心文件末尾可能存在损坏; IDR帧保证以后的帧不能引用任何先前的数据,但没有任何东西表明早期的B帧不能向前看IDR帧.
那么,我怎么知道切割的安全位置,这样切割前的B帧不会试图超越它?
我正在使用FFmpeg库生成包含来自各种文件(如MP3,WAV,OGG)的音频的MP4文件,但我遇到了一些麻烦(我也在那里放视频,但为了简单起见我省略了对于这个问题,因为我已经有了这个工作).我当前的代码打开一个音频文件,解码内容并将其转换为MP4容器,最后将其作为交错帧写入目标文件.
它适用于大多数MP3文件,但是当输入WAV或OGG时,产生的MP4中的音频稍微失真并且经常以错误的速度播放(快达或快多倍).
我已经看过无数使用转换函数(swr_convert)的例子,但我似乎无法摆脱导出音频中的噪音.
这是我如何将音频流添加到MP4(outContext是输出文件的AVFormatContext):
audioCodec = avcodec_find_encoder(outContext->oformat->audio_codec);
if (!audioCodec)
die("Could not find audio encoder!");
// Start stream
audioStream = avformat_new_stream(outContext, audioCodec);
if (!audioStream)
die("Could not allocate audio stream!");
audioCodecContext = audioStream->codec;
audioStream->id = 1;
// Setup
audioCodecContext->sample_fmt = AV_SAMPLE_FMT_S16;
audioCodecContext->bit_rate = 128000;
audioCodecContext->sample_rate = 44100;
audioCodecContext->channels = 2;
audioCodecContext->channel_layout = AV_CH_LAYOUT_STEREO;
// Open the codec
if (avcodec_open2(audioCodecContext, audioCodec, NULL) < 0)
die("Could not open audio codec");
Run Code Online (Sandbox Code Playgroud)
并从MP3/WAV/OGG(从文件名变量)打开声音文件...
// Create contex
formatContext = avformat_alloc_context();
if (avformat_open_input(&formatContext, filename, NULL, NULL)<0)
die("Could not …Run Code Online (Sandbox Code Playgroud)