[實踐] python 處理 m3u8 有視頻無音頻錄像文件

引言

我們公司主要從事線上音樂教育,比較看中直播生成的錄像回放質量

事件

講師生成的m3u8回放,前面4分鐘沒有聲音

預期處理

截掉前4分鐘的無聲音視頻,並把剩餘的ts視頻合成mp4文件;腳本語言: python

處理

第一步

把m3u8中所有的ts文件下載到本地,這個時候python庫的強大就體現出來了
https://github.com/globocom/m3u8.git
提供了讀取m3u8內部文件信息的庫

"""
獲取m3u8ts文件
"""
def getM3u8(url):
    m3u8_obj = m3u8.load(url)  # this could also be an absolute filename

    ts_url_list = []

    base_uri = m3u8_obj.base_uri

    ts_list = m3u8_obj.files

    for _ts in ts_list:

        ts_url = base_uri + _ts

        ts_url_list.append(ts_url)

    # print ts_url

    # response = requests.head(ts_url)

    # if response.status_code == 200:
    #     print "URL 沒問題"

    return ts_url_list

第二步

下載ts文件到指定路徑,並手動刪除出現問題的幾個ts文件

"""
下載ts文件
"""
def download_movie(movie_url, _path):
    os.chdir(_path)
    print '>>>[+] downloading...'
    print '-' * 60
    error_get = []

    for _url in movie_url:
        # ts視頻的名稱
        # movie_name = _url.split('/')[-1][-6:]
        movie_name = str(_url.split("/")[7]).split("?")[0]
        try:
            # 'Connection':'close' 防止請求端口占用
            # timeout=30    防止請求時間超長連接
            movie = requests.get(_url, headers = {'Connection':'close'}, timeout=60)
            with open(movie_name, 'wb') as movie_content:
                movie_content.writelines(movie)
            print '>>>[+] File ' + movie_name + ' done'
        # 捕獲異常,記錄失敗請求
        except:
            error_get.append(_url)
            continue
    # 如果沒有不成功的請求就結束
    if error_get:
        # print u'共有%d個請求失敗' % len(file_list)
        print '-' * 60
        download_movie(error_get, _path)
    else:
        print '>>>[+] Download successfully!!!'

第三步

採用 ffmpeg方式 ,輸出合併ts文件的命令

 """
合併ts文件,輸出執行語句
ls * | perl -nale 'chomp;push @a, $_;END{printf "ffmpeg -i \"concat:%s\" -acodec copy -vcodec copy -absf aac_adtstoasc out.mp4\n", join("|",@a)}' 
"""
def hebing(path,outfile):
    filelist = []
    for file in os.listdir(path):
        if len(file.split(".")) == 2:
            if file.split(".")[1] == 'ts':
                filelist.append(path + file)
    str = '|'.join(filelist)

    cmd_str = 'ffmpeg -i \"concat:' + str + '\" ' + '-acodec copy -vcodec copy -absf aac_adtstoasc ' + path + outfile
    print cmd_str
    return cmd_str

第四步

運行shell命令

"""
運行ffmpeg
"""
def runConvertMp4(cmd_str):
    str_env = "/Users/huqingen/Desktop/Finger/tool/ffmpeg/"
    str_cmd = str_env + cmd_str
    print str_cmd
    subprocess.call(str_cmd, shell=True)

第五步

main方法運行

if __name__ == "__main__":
    url = "http://xxxxxx.com/xxxx.m3u8?auth_key=xxxxx"
    path = "/opt/ts/"
    ts_url_list = getM3u8(url)
    download_movie(ts_url_list,path)
    cmd_str = hebing(path,"out.mp4")
    runConvertMp4(cmd_str)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章